目錄
如果父類成員和子類成員名字相同是否允許?會發生什麼?
#include
using namespace std;
class base
};class derived : public base
};int main()
int main()
結果卻是都列印base class
base class
base class
結果沒有符合預期,分析:
1.傳入父類物件b的位址時,父類指標指向父類物件,列印正www.cppcns.com常;
2.傳入子類物件d的位址時,父類指標指向子類物件,此時由於賦值相容性(子類物件可以當作父類物件使用),子類物件退化為父類物件(父類指標只能訪問父類成員),編譯器認為父類指標指向的是父類物件,因此最終呼叫了父類的列印函式
以上結果是合理的,卻沒有符合預期的目的,這也是函式重寫帶來的問題。如果不能實現以上目的,函式重寫是沒有意義的,那麼如何實現父類指標(引用)指向:
實際上以上行為就是多型
所謂多型,即同樣的呼叫語句,在實際執行時存在不同的表現狀態,依據則是物件的型別不同
要實現上文中函式重寫的多型,需要引入virtual關鍵字,c++原生支援多型
在父類函式print宣告前新增virtual關鍵字,print函式成為虛函式,子類重寫的函式也將自動變成虛函式,這樣就可以實現多型
class base
{public:
virtual void print()//加virtual變成了虛函式
{cout<
執行結果
base class
derived class
多型的意義:
在程式執行過程中展現出動態的特性函式重寫必須多型實現,否則沒有意義多型是物件導向元件化程式設計的基礎特性
同名覆蓋是繼承時發生在父類和子類之間,子類同名成員覆蓋(遮蔽)父類同名成員的現象;函式重寫也是同名覆蓋,函式重寫多型實現才有意義,c++通過virtual支援多型多型是物件導向元件化程式設計的基礎特性
本文標題: c+繼承之同名覆蓋,函式重寫與多型詳解
本文位址:
C 之同名覆蓋 多型
一.同名覆蓋引發的問題 父子間的賦值相容 子類物件可以當作父類物件使用 相容性 1.子類物件可以直接賦值給父類物件 2.子類物件可以直接初始化父類物件 3.父類指標可以指向子類物件 4.父類引用可以直接引用子類物件 示例 include include using namespace std cla...
C 多型(重寫與覆蓋)
覆蓋 覆蓋 在子類和父類中,方法名 引數列表和返回值全部相同,構成覆蓋,重寫時子類重寫父類的方法,即子類將父類的方法覆蓋。此時需要使用new關鍵字,隱藏父類的細節 class animal class cat animal 重寫 public class a public class b a sta...
C 繼承 同名隱藏 覆蓋,虛函式
不同作用域宣告的識別符號的可見性原則 如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。在類的派生層...