//#include "stdafx.h"
#include using namespace std;
class a
;class b:virtual public a //虛繼承
{};class c: public a
{};int _tmain(int argc, _tchar* argv)
虛函式的實質是乙個指標,指向虛函式表,這個表的位置我現在還不太清楚,不過這樣做的好處是實現了動態確定乙個函式
因為指標指向的位置可以變化,這樣就可以實現override覆蓋。子類覆蓋父類方法的實質就是填寫這個指標指向什麼位置的過程
同樣虛繼承的實質也是一樣,實際就是乙個指標,就好像c++中聲名乙個物件,可以
a a;
也可以a* a = new a();
第二種就是宣告乙個指標,指向乙個堆中的物件。第一種就不是指標的形式
所以第二種形式就有動態性,是多型的基礎
假設a的子類是ason,使用語句
a* aa = new ason();
就是把乙個a型別的指標指向了ason物件,呼叫的方法自然也就是ason的了
經過以上分析就可以知道示例程式中a類中有乙個int i佔4位元組,另外f()是乙個指標,所以是4位元組,所以sizeof(a)=8
這裡需要引申一下的是多個虛函式只維護乙個指向虛函式表的指標,也就是說如果a中還有這樣幾個函式
virtual void f1();
virtual void f2();
virtual void f3();
virtual void f4();
virtual void f5();
那麼sizeof(a)還是8
類中所有的函式是不佔空間的。如果在a中宣告void f(); sizeof(a)沒有變化
b是虛擬繼承a所以比a多乙個指標,也就是說sizeof(b)=12
c是一般的繼承,與a大小一樣,也是8
虛繼承和虛函式繼承
虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...
關於虛函式和虛繼承
基類中無虛函式,派生類中有虛函式,基類的指標指向派生類物件 指向的是派生類中基類的起始部分 delete 時只析構基類的物件而不析構派生類的物件。基類指標指向派生類的的情況下,基類的虛構要設為虛析構。虛表合併時向內層合併,虛表合併時會先拷貝乙份副本,然後合併的時候使用副本合併。虛函式表的生成在編譯器...
c 虛函式和虛繼承
c 中,多型的實現需要虛函式,而虛函式主要包括兩部分,虛函式指標和虛函式表。基類將自己的一些函式設為虛函式,子類則需要在繼承基類後,重寫或者直接使用從基類的繼承下來的虛函式。基類自己會儲存乙份虛函式表,這個虛函式表含有指向基類虛函式的虛函式指標。當子類繼承基類後,同樣會將基類的虛函式表繼承下來,這樣...