道經(jīng)典題目---虛函數(shù)繼承和虛繼承 1#include <cstdlib> 2#include <iostream> 3#include <memory> 4 5using namespace std; 6class A 7{ 8 char k[3]; 9 public: 10 virtual void aa(){}; 11}; 12 13class B : public virtual A 14{ 15 char j[3]; 16 public: 17 virtual void bb(){}; 18}; 19 20class C : public virtual B 21{ 22 char i[3]; 23 public: 24 virtual void cc(){}; 25}; 26 27int main(int argc, char *argv[]) 28{ 29 cout<<"sizeof(A):"<<sizeof(A)<<endl; 30 cout<<"sizeof(B):"<<sizeof(B)<<endl; 31 cout<<"sizeof(C):"<<sizeof(C)<<endl; 32 system("PAUSE"); 33 return EXIT_SUCCESS; 34} 問題:程序運(yùn)行的結(jié)果? 答案:8,16,24。 解釋: (1)對于類A,由于有一個虛函數(shù),那么必須得有一個對應(yīng)的虛函數(shù)表來記錄對應(yīng)的函數(shù)入口地址。每個地址需要一個虛指針,指針的大小為4。類中還有一個char k[3],當(dāng)然大小為3。為什么是8呢?因?yàn)樵谟?jì)算機(jī)里,是以4為單位,所以第一條輸出的結(jié)果為8。 (2)對于類B,同類A一樣,自己的大小為8,但是由于虛繼承類A,所以在虛表中要加入一個虛類指針來指向其類A,然后在包含類A的所有成員,sizeof(A)為8,結(jié)果便是16。 (3)對于類C,同類B一樣,自己的大小8,加上sizeof(B),結(jié)果為24。 虛繼承就是為了節(jié)約內(nèi)存的,他是多重繼承中的特有的概念。適用與菱形繼承形式。 虛函數(shù)繼承就是覆蓋。即基類中的虛函數(shù)被派生類中的同名函數(shù)所覆蓋。 是實(shí)現(xiàn)多態(tài)的方法。 |
|