C++类的继承关系——多继承(未重写虚函数)

本文通过示例代码详细介绍了C++中多继承及虚函数的概念,解释了虚函数如何支持多态,并展示了在多继承场景下虚表的位置与布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   首先,在介绍有虚函数的多继承(未重写虚函数),先介绍一下以下概念。

       多态:多种形态,简单地说父类的指针或引用调用重写的虚函数,当父类的指针或引用指向父类对象调用的就是父类的虚函数,指向子类对象时调用的就是是子类的虚函数

       虚函数: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;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值