【C++】多态(三)-------虚拟继承和菱形虚拟继承(带有虚函数)

1.菱形继承(带有虚函数)

(1)派生类未增加新的虚函数

class B
{
public:
	virtual void TestFunc1()
	{
		cout << "B::TestFunc1" << endl;
	}
	virtual void TestFunc2()
	{
		cout << "B::TestFunc2" << endl;
	}

	int _b;
};

class D :virtual public B
{
public:
	virtual void TestFunc1()
	{
		cout << "D::TestFunc1" << endl;
	}
	
	int _d;
};
typedef void(*PVTF)();

void Print(B & b, string const& str)
{
	cout << str << endl;
	PVTF *pVTF = (PVTF*)*(int*)&b;
	while (*pVTF)
	{
		(*pVTF)();
		pVTF++;
	}
	cout << endl;
}
int main()
{
	cout << sizeof(D) << endl;
	D d;
	d._b = 1;
	d._d = 2;
	Print(d, "D VFT:");
}

结果:


分析:

对象模型和虚函数表:


(2)派生类增加了新的虚函数:

派生类增加了TestFunc3
virtual void TestFunc3()
{	cout << "D::TestFunc3" << endl;
}
主函数:
int main()
{
	cout << sizeof(D) << endl;
	D d;
	d._b = 1;
	d._d = 2;
	B &b = d;
	Print(d, "D VFT:");
	Print(b, "D VFT---B:");
}

结果:


分析:


2.菱形虚拟继承(带有虚函数)

class B
{
public:
	virtual void TestFunc1()
	{
		cout << "B::TestFunc1" << endl;
	}
	virtual void TestFunc2()
	{
		cout << "B::TestFunc2" << endl;
	}

	int _b;
};

class C1 :virtual public B
{
public:
	virtual void TestFunc1()//重写B中的TestFunc1
	{
		cout << "C1::TestFunc1" << endl;
	}
	virtual void TestFunc3()//新增TestFunc3
	{
		cout << "C1::TestFunc3" << endl;
	}
	int _c1;
};

class C2 :virtual public B
{
public:
	virtual void TestFunc2()//重写B中的TestFunc2
	{
		cout << "C2::TestFunc2" << endl;
	}
	virtual void TestFunc4()//新增
	{
		cout << "C2::TestFunc4" << endl;
	}
	int _c2;
};

class D :public C1, public C2
{
public:
	virtual void TestFunc1()//重写
	{
		cout << "D::TestFunc1" << endl;
	}
	virtual void TestFunc3()//重写
	{
		cout << "D::TestFunc3" << endl;
	}
	virtual void TestFunc4()//重写
	{
		cout << "D::TestFunc4" << endl;
	}
	virtual void TestFunc5()//新增
	{
		cout << "D::TestFunc5" << endl;
	}
	int _d;
};

typedef void(*PVTF)();

void Print(B & b, string const& str)
{
	cout << str << endl;
	PVTF *pVTF = (PVTF*)*(int*)&b;
	while (*pVTF)
	{
		(*pVTF)();
		pVTF++;
	}
	cout << endl;
}

void Print(C1 & b, string const& str)
{
	cout << str << endl;
	PVTF *pVTF = (PVTF*)*(int*)&b;
	while (*pVTF)
	{
		(*pVTF)();
		pVTF++;
	}
	cout << endl;
}

void Print(C2 & b, string const& str)
{
	cout << str << endl;
	PVTF *pVTF = (PVTF*)*(int*)&b;
	while (*pVTF)
	{
		(*pVTF)();
		pVTF++;
	}
	cout << endl;
}

int main()
{
	D d;
	d.C1::_b = 1;
	d._c1 = 2;
	d._c2 = 3;
	d._d = 4;
	C1& c1 = d;
	C2& c2 = d;
	B& b = d;
	cout << sizeof(D) << endl;
	Print(b, "D VTF--->B");
	Print(c1, "D VTF--->C1");
	Print(c2, "D VTF--->C2");

	return 0;
}

结果:


分析:




猜你喜欢

转载自blog.csdn.net/zimituanzi_/article/details/80941170