道經(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)樵谟嬎銠C(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)的方法。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。