C 繼承之同名覆蓋,函式重寫與多型詳解

2022-09-24 09:30:13 字數 1069 閱讀 3498

目錄

如果父類成員和子類成員名字相同是否允許?會發生什麼?

#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 繼承 同名隱藏 覆蓋,虛函式

不同作用域宣告的識別符號的可見性原則 如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。在類的派生層...