C++快速入門--12--抽象類和介面模擬

丶幻一發表於2018-03-16

初探抽象類

什麼是抽象類?含有純虛擬函式的類為抽象類,什麼是純虛擬函式?即virtual void fun() = 0;這樣的函式即為純虛擬函式。

class Figer{
public:
    virtual int getArea() = 0;
};

class Circle:public Firger{
public:
    Circle(int a,int b){
        this->a = a;
        this->b = b;
    }
    virtual int getArea(){
        return 3.14 * this->a * this->b;
    }
private:
    int a,b;
};

class Square:public Figer{
public:
    Square(int a,int b){
        this->a = a;
        this->b = b;
    }
    virtual int getArea(){
        return a*b;
    }
private:
    int a,b;
};

void printArea(Figer & figer){
    cout<<getArea()<<endl;
}

int main(){
    Circle c(1,2);
    Square s(1,2);
    printArea(c);
    printArea(s);
    return 0;
}

有了抽象類之後,我們就可以面向介面程式設計,我們可以先定義一套抽象類别範本,然後再去實現它。實現每個模組的不需要關係別人是怎麼實現的,因為利用C++的多型性,我們只需要通過模板類指向子類物件即可
例如上面的printArea()方法,Square類和Circle類可以是兩個不同的人寫的,他們不需要關係對方是怎麼實現的,都只需要將引數傳遞到printArea即可完。

使用抽象類模擬java介面

在C++你不能直接定義一個介面,但是你可以通過抽象類模擬介面。

class Interface1 {
public:
    virtual int add(int a, int b) = 0;
    virtual void print() = 0;
};

class Interface2 {
public:
    virtual int mult(int a,int b) = 0;
    virtual void print() = 0;
};

class Parent {
protected:
    int a;
    Parent(int a) {
        this->a = a;
    }
    virtual int getA() {
        return this->a;
    }
};

class Child :public Parent,public Interface1,public Interface2{
public:
    Child(int a):Parent(a) {
        this->a = 2;
    }
    virtual int add(int a,int b) {
        return a + b;
    }
    virtual int mult(int a,int b) { 
        return a * b;
    }
    virtual void print() {
        cout << this->a << endl;
    }   
    virtual int getA() {
        return this->a;
    }
};  

int main() {
    Interface1 * c1 = new Child(1);
    Interface2 * c2 = new Child(2);
    cout << c1->add(1, 2) << endl;
    cout << c2->mult(1, 2) << endl;
    c1->print();
    delete (Child *)c1;
    delete (Child *)c2;
    system("pause");
}

你會發現,這裡的Interface1和Interface2就像java中一個介面,它沒有自己的實現,而是定義了一套模板,交給子類去實現,java介面與抽象類的區別主要在於,介面可以實現多個,而抽象類只能被繼承一次,而在C++中的多繼承,就可以不用擔心這個抽象類只能被繼承一次。

相關文章