C++的核心特性:繼承機制

lanyu發表於2021-09-09

這篇文章要寫的是c++的繼承機制。

c++的類裡面的三種函式,第一種是pure virtual function(純虛擬函式),第二種是virtual function(虛擬函式),第三種是non-virtual function(非虛擬函式)。在設計一個類的時候,(尤其是基類的時候)要考慮設計的函式,要寫成什麼型別。

純虛擬函式:派生類只繼承介面
虛擬函式:派生類可以繼承介面和一個預設的實現
非虛擬函式:派生類繼承基類的一個強制的實現
(from 《effective  c++》)

下面分別舉幾個例子:

  • 純虛擬函式:

class Base_PureVirtualFunction {public :    virtual void print() = 0;
};class Derived_PureVirtualFunction:public Base_PureVirtualFunction {public:    void print() {        cout << "derived " << endl;
    }
};int main() {    //Base_PureVirtualFunction b;//  錯誤,沒有辦法建立含有純虛擬函式的物件,因為純虛擬函式沒有相應的實現
    Derived_PureVirtualFunction d;
    d.print()    return 0;
}

純虛擬函式的作用是 只希望派生類繼承基類的介面,然後去根據派生類的情況,去給他一個實現。

  • 虛擬函式

class Base_VirtualFunction {public:    virtual void print() {        cout << "base" << endl;
    }
};class Drived_VirtualFunction:public Base_VirtualFunction {public:    void print() {        cout << "derived" << endl;
    }
};int main() {    //demo2
    Base_VirtualFunction b;
    b.print();     //輸出base

    Drived_VirtualFunction d;
    d.print();    //輸出derived

    b = d;
    b.print();    //輸出base

    // 關於虛擬函式的另外一個知識點,動態聯編
    // 動態聯編 只有指標和引用有效
    Base_VirtualFunction *b1 = &d;
    b1->print();    //輸出derived

    Base_VirtualFunction &b2 = d;
    b2.print();     //輸出derived

    system("pause");    return 0;
}

虛擬函式的機制是,基類向派生類提供一個介面和預設的實現,派生類可以根據情況,自己定義符合自身的實現,也可以呼叫基類的預設的實現。這裡還有關於虛擬函式的另外一個知識點,動態聯編,重點不在這裡,就不解釋了。

  • 非虛擬函式

class Base_NonVirtualFunction {public:    void print() {        cout << "non virtual function " << endl;
    }
};class Drived_NonVirtualFunction :public Base_NonVirtualFunction {public :    void other_print() {        cout << "other " << endl;
    }
};int main(){
    Base_NonVirtualFunction b;
    b.print();   //輸出non virtual function

    Drived_NonVirtualFunction d;
    d.print();   // 輸出non virtual function
    d.other_print();  //輸出other}

對於非虛擬函式:
1 . 派生類其實繼承了基類的所有函式的資料成員
2 .  非虛擬函式的作用是基類給派生類的一個強制性實現的函式

3 . 對於一個基類給派生類的一個強制性實現的函式,派生類也可以重新定義一個相同名字的函式,不過這樣就是覆蓋了。派生類的函式會覆蓋掉基類的函式。

一個新的例子:

class Base_NonVirtualFunction {public:    void print() {        cout << "non virtual function " << endl;
    }
};class Drived_NonVirtualFunction :public Base_NonVirtualFunction {public :    void other_print() {        cout << "other " << endl;
    }       //和子類同名的函式
    void print() {        cout << " derived" << endl;
    }
};int main(){
    Base_NonVirtualFunction b;
    b.print();    //輸出non virtual function

    Drived_NonVirtualFunction d;
    d.print();    //輸出 derived
    d.other_print();   //輸出 other}

這裡想強調的是,無論是自己在設計類的時候,還是在看別人的程式碼的時候,首先應該注意一下:



作者:zhaozhengcoder
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2035/viewspace-2820778/,如需轉載,請註明出處,否則將追究法律責任。

相關文章