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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java的繼承機制Java繼承
- Javascript繼承機制總結JavaScript繼承
- 【機制】JavaScript的原型、原型鏈、繼承JavaScript原型繼承
- Javascript繼承機制的設計思想JavaScript繼承
- C++繼承一之公有繼承C++繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- C++繼承C++繼承
- C++中的繼承C++繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- 探索 React 中 es6 的繼承機制React繼承
- 深入理解javascript中的繼承機制(1)JavaScript繼承
- C++ | 類繼承C++繼承
- C++菱形繼承C++繼承
- C++虛繼承的概念C++繼承
- C++繼承體系C++繼承
- c++中的繼承關係C++繼承
- C++多繼承的細節C++繼承
- Python類繼承的高階特性Python繼承
- [C++]繼承和派生類C++繼承
- 說說C++多重繼承C++繼承
- c++ 虛繼承詳解C++繼承
- c++ 記憶體 繼承C++記憶體繼承
- C++ 整理15_繼承C++繼承
- C++ protected繼承意義C++繼承
- C++繼承時的修飾符C++繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- ES5和ES6及繼承機制繼承
- Javascript繼承機制分析+simple-inheritance原始碼分析JavaScript繼承原始碼
- 深入瞭解JavaScript中基於原型(prototype)的繼承機制JavaScript原型繼承
- 在繼承和多型中的記憶體分配機制繼承多型記憶體
- C++高階教程之繼承得本質:單繼承(一)C++繼承
- C++學習筆記——C++ 繼承C++筆記繼承
- C++中的虛繼承的構造C++繼承
- java核心思想物件導向三大特性(封裝,繼承,多型)Java物件封裝繼承多型
- CSS系列:CSS的繼承與層疊特性CSS繼承
- 深入C++ Builder之編寫自己的元件 -深入分析VCL繼承、訊息機制(2) (轉)C++UI元件繼承
- 深入C++ Builder之編寫自己的元件-深入分析VCL繼承、訊息機制(3) (轉)C++UI元件繼承
- Java核心技術筆記 繼承Java筆記繼承