一 多重繼承
1) 代碼:

Code
#include <iostream>
using namespace std;
class B1
{
public:
int x;
virtual void v1(){ cout << "B1::v1" << endl; }
void f1(){cout << "B1::f1" << endl; }
};
class B2
{
public:
int y;
virtual void v2(){ cout << "B2::v2" << endl; }
void f2(){ cout << "B2::f2" << endl; }
};
class B3
{
public:
int z;
virtual void v3(){ cout << "B3::v3" << endl; }
void f3(){ cout << "B3::f3" << endl; }
};
class D : public B1, public B2, public B3
{
public:
int a;
void v3(){ cout << "D::v3" << endl; }
virtual void vD(){ cout << "D::vD" << endl; }
};
2)類圖:
3)VS2008的編譯選項(xiàng)查看布局:
4)可視化表示:
5)代碼驗(yàn)證:

Code
typedef void (*Fun)();
void PrintMember(int *pI)
{
cout << *pI << endl;
}
void PrintVT(int *pVT)
{
while(*pVT != NULL)
{
(*(Fun*)(pVT))();
pVT++;
}
}
void PrintVTAndMember(B1 *pD)
{
int *pRoot = (int*)pD;
int *pVTB1 = (int*)*(pRoot + 0);PrintVT(pVTB1);
int *pMB1 = pRoot +1; PrintMember(pMB1);
int *pVTB2 = (int*)*(pRoot + 2);PrintVT(pVTB2);
int *pMB2 = pRoot +3; PrintMember(pMB2);
int *pVTB3 = (int*)*(pRoot + 4);PrintVT(pVTB3);
int *pMB3 = pRoot +5; PrintMember(pMB3);
}
void TestVT()
{
B1 *pB1 = new D();
D *pD = dynamic_cast<D*>(pB1);
pD->x = 10;
pD->y = 20;
pD->z = 30;
pD->a = 40;
PrintVTAndMember(pD);
delete pD;
}
6) 驗(yàn)證代碼運(yùn)行結(jié)果:
7)總結(jié):
與單繼承相同的是所有的虛函數(shù)都包含在虛函數(shù)表中,所不同的多重繼承有多個(gè)虛函數(shù)表,當(dāng)子類對(duì)父類的虛函數(shù)有重寫時(shí),子類的函數(shù)覆蓋父類的函數(shù)在對(duì)應(yīng)的虛函數(shù)位置,當(dāng)子類有新的虛函數(shù)時(shí),這些虛函數(shù)被加在第一個(gè)虛函數(shù)表的后面。
二 多重繼承運(yùn)行時(shí)類型轉(zhuǎn)化
1)代碼驗(yàn)證:

Code
void TestDynamicCast()
{
B1 *pB1 = new D();
cout << "B1:" << pB1 << endl;
D *pD = dynamic_cast<D*>(pB1);
cout << "D:"<< pD << endl;
B2 *pB2 = dynamic_cast<B2*>(pB1);
cout << "B2:" << pB2 << endl;
B3 *pB3 = dynamic_cast<B3*>(pB1);
cout << "B3:" << pB3 << endl;
delete pD;
}
2)驗(yàn)證代碼的運(yùn)行結(jié)果:
3)總結(jié):
從多重繼承的內(nèi)存布局,我們可以看到子類新加入的虛函數(shù)被加到了第一個(gè)基類的虛函數(shù)表,所以當(dāng)dynamic_cast的時(shí)候,子類和第一個(gè)基類的地址相同,不需要移動(dòng)指針,但是當(dāng)dynamic_cast到其他的父類的時(shí)候,需要做相應(yīng)的指針的移動(dòng)。
三 完!
感謝,Thanks!
作者:iTech
出處:http://itech.cnblogs.com/
轉(zhuǎn)載:本文版權(quán)歸作者iTech所有,轉(zhuǎn)載請(qǐng)注明出處,不得用于商業(yè)用途!
C++對(duì)象模型系列:
本系列是主要是作者經(jīng)驗(yàn)的總結(jié)且同時(shí)參考了大量的網(wǎng)絡(luò)文章,希望能夠給C++的學(xué)習(xí)者有所幫助,但是由于作者水平有限,難免有錯(cuò),希望大家能夠指出,我將虛心地向大家學(xué)習(xí),與大家共同進(jìn)步!本系列的開發(fā)環(huán)境是Windows 32+VS2008。