C 多型,虛函式

2021-06-15 05:24:17 字數 1677 閱讀 5612

在c++中可以用基類指標指向其派生類,如果乙個派生類繼承多個父類,那麼如何通過基類指標訪問同名的成員呢?

如果基類a,基類b中都有函式fun(),派生類在同時繼承a、b後在記憶體中根據繼承的順序分配記憶體,例如在繼承列表中出現的是b,a,那麼b中的成員在a的之前,當我們用b的指標去訪問時候,編譯器便將指標指向b的成員,同理用a的指標去訪問,編譯器便將指標指向a的成員。

class base1

{public:

int val;

void fun()

{ cout<

deriver *der=new deriver;

base1 *p1=der;

p1->fun();

base2 *p2=der;

p2->fun();

輸出:

output from base1

output from base2

我們知道我們要通過乙個基類的指標訪問派生類中和基類同名的成員的時候,需要將基類中同名的函式宣告為虛函式這樣就可以通過基類的指標訪問派生類的同名成員了

class base1

{public:

int val;

virtual void fun()

{ cout<

deriver *der=new deriver;

base1 *p1=der;

p1->fun();

base2 *p2=der;

p2->fun();

結果輸出:

因為base1中fun()宣告為虛函式,用base1的指標去訪問fun()的時候會訪問到派生類中的成員,而base2中沒有宣告為虛函式,在訪問時訪問到了基類的成員。可以看到,在派生類中並沒有顯示的宣告fun()為虛函式,當派生類中的成員函式在

與基類都相同時,派生類的函式變覆蓋了基類同名函式,但是任然可以通過base1::fun()限定符來訪問積累中的成員,一般只有那些希望實現多型的函式採用virtual修飾,否則就會出現用上面那樣,基類指標和派生類指標訪問到的成員不同的情況造成混亂。

最後,只有通過指標和引用訪問成員的時候才會出現多型。

總之,宣告為虛函式,呼叫的時候取決於指向物件的型別,沒有宣告,呼叫取決於指標的型別。

析構函式為虛函式的情況

有了上面的討論可以知道,當我們用乙個基類的指標指向乙個派生類的時候,如果函式宣告為虛函式,那麼就會根據具體是指向哪乙個類來呼叫改函式,析構函式也是如此。當我們用指向派生類的基類指標進行delete操作的時候,如果析構函式宣告為虛函式,那麼就會以以下方式進行析構函式呼叫

class base1

{public:

virtual ~base1()

{ cout<

deriver *der=new deriver;

base1 *p1=der;

p1->fun();

delete p1;

得到如下結果

可以看到base2的析構函式沒有被呼叫。

C 虛函式多型

由虛函式實現的動態多型性就是 同一類族中不同類的物件,對同一函式呼叫作出不同的響應。虛函式的使用方法是 1 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。2 在派生類中重新定義此函式,要...

C 多型,虛函式

多型是指使用相同的函式名來訪問函式不同的實現方法,即 一種介面,多種方法 用相同的形式訪問一組通用的運算,每個運算可能對應的行為不同。c 支援編譯時多型和執行時多型,運算子過載和函式過載就是編譯時多型,而派生類和虛函式實現執行時多型。執行時多型的基礎是基類指標,基類指標可以指向任何派生類物件。2.虛...

C 多型,虛函式

是對於不同物件接收相同訊息時產生不同的動作,體現在編譯和執行兩個方面。編譯時多型體現在函式和運算子的過載上 執行時多型通過繼承和虛函式體現 在基類中冠以關鍵字virtual的成員函式,使得允許在派生類中對基類的虛函式重新定義 對虛函式的呼叫有動態聯編和靜態聯編。建構函式不能是虛擬的,但析構函式可以是...