1. 程式人生 > >C++類的繼承關係——多繼承(未重寫虛擬函式)

C++類的繼承關係——多繼承(未重寫虛擬函式)


   首先,在介紹有虛擬函式的多繼承(未重寫虛擬函式),先介紹一下以下概念。

       多型:多種形態,簡單地說父類的指標或引用呼叫重寫的虛擬函式,當父類的指標或引用指向父類物件呼叫的就是父類的虛擬函式,指向子類物件時呼叫的就是是子類的虛擬函式

       虛擬函式:C++中虛擬函式的主要作用就是實現多型, 在一個類的成員函式前面加上virtual關鍵字,該函式就被定義成虛擬函式,虛擬函式的地址存放在虛表(存放虛擬函式地址的表,虛表的地址存放在所定義物件中)

       那麼,當一個子類有多個父類,子類的虛表會放在什麼位置?

       請看下例:

class Base
{
public:
	virtual void FunTest1()
	{
		cout << "Base::FunTest1()" << endl;
	}
	virtual void FunTest2()
	{
		cout << "Base::FunTest2()" << endl;
	}
	int _data1;

};

class Base1
{
public:
	virtual void FunTest3()
	{
		cout << "Base1::FunTest3()" << endl;
	}
	virtual void FunTest4()
	{
		cout << "Base1::FunTest4()" << endl;
	}
	int _data2;
};

class Derive :public Base, public Base1
{
public:
	virtual void FunTest5()
	{
		cout << "Derive::FunTest5()" << endl;
	}
	int _data3;
};

typedef void(*VtbFun)();
void PrintVtable()
{
	Derive d1;
	d1._data1 = 0x01;
	d1._data2 = 0x02;
	int* pVTable = (int *)*(int*)&d1;
	VtbFun FunTest = (VtbFun)*pVTable;
	while (NULL != FunTest)
	{
		FunTest();
		cout << (int*)FunTest << endl;
		pVTable += 1;
		FunTest = (VtbFun)*pVTable;
	}
}

int main()
{
	Derive d;
	d._data1 = 0x01;
	d._data2 = 0x02;
	d._data3 = 0x03;
	PrintVtable();
	return 0;
}