C++的核心特性:繼承機制
這篇文章要寫的是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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【機制】JavaScript的原型、原型鏈、繼承JavaScript原型繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- C++繼承C++繼承
- C++中的繼承C++繼承
- C++ | 類繼承C++繼承
- 探索 React 中 es6 的繼承機制React繼承
- C++繼承體系C++繼承
- c++中的繼承關係C++繼承
- C++ 整理15_繼承C++繼承
- C++ protected繼承意義C++繼承
- C++繼承時的修飾符C++繼承
- java核心思想物件導向三大特性(封裝,繼承,多型)Java物件封裝繼承多型
- C++學習筆記——C++ 繼承C++筆記繼承
- C++高階教程之繼承得本質:單繼承(一)C++繼承
- ES5和ES6及繼承機制繼承
- 深入瞭解JavaScript中基於原型(prototype)的繼承機制JavaScript原型繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- Java核心技術筆記 繼承Java筆記繼承
- Java的三大特性:封裝、繼承、多型Java封裝繼承多型
- 物件導向 -- 三大特性之繼承物件繼承
- C++ 多級繼承與多重繼承:程式碼組織與靈活性的平衡C++繼承
- 原型鏈的繼承機制及其背後的程式設計哲學原型繼承程式設計
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- 詳解C++中繼承的基本內容C++中繼繼承
- c++繼承,隱藏(重定義)C++繼承
- [c++] 繼承和多型整理二C++繼承多型
- 【c++基礎】菱形繼承問題C++繼承
- 你不知道的事---SringCloud的feign的繼承特性GCCloud繼承
- 菱形繼承,虛繼承繼承
- 原型,繼承——原型繼承原型繼承
- 類的繼承_子類繼承父類繼承
- C++ class 和 struct 可以相互繼承嗎C++Struct繼承
- C++ exception 異常類繼承關係C++Exception繼承
- 多繼承 與 多重繼承繼承
- API的使用(3)Arrays 類,Math類,三大特性--繼承API繼承
- Java物件導向03——三大特性之繼承Java物件繼承
- Java中物件導向三大特性之繼承Java物件繼承
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式