虚函数总结(二) 多重继承的虚函数表

本文探讨了C++中多继承情况下虚函数的工作原理。包括没有虚函数覆盖时子类如何继承基类的虚函数,以及当子类覆盖基类虚函数时的行为变化。通过示例代码展示了不同情况下的虚函数表布局。

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

单继承时虚函数:http://blog.youkuaiyun.com/qq_35116353/article/details/61951720

多继承下的虚函数是怎样的呢?

没有虚函数覆盖时:

运行下面程序

#include <iostream>
using namespace std;

typedef void (* pFun)(void);
class Base1{
public:
	virtual void e(){ cout<<"B1:: e()       "<<endl;}
	virtual void f(){ cout<<"B1:: f()       "<<endl;}
	virtual void g(){ cout<<"B1:: g()       "<<endl;}

};

class Base2{
public:
	virtual void h(){ cout<<"B2:: h()       "<<endl;}
	virtual void i(){ cout<<"B2:: i()       "<<endl;}
};

class Base3{
public:
	virtual void j(){ cout<<"B3:: j()       "<<endl;}

};


class Derive: public Base1,Base2,Base3{
public:
	Derive() {cout<<"sizeof(Derive) is : "<<sizeof(Derive)<<endl;}
	virtual void k(){cout<<"D::k()"<<endl;}


};


int main()
{
	Base1 base1;
	Base2 base2;
	Base3 base3;
	Derive derive;	
	for (int i=0; i<4; i++)
	{
	    pFun fun = (pFun)* ((int*)*(int*)&derive + i);
	    fun();
	}
	

	
	return 0;
}

查看子类实例 有三个地址,里面分别有4个,2个,1个地址,查看这些地址的内容





第一个虚表的内容是基类的三个虚函数以及子类的虚函数,

第二个虚表的内容是第二个基类虚函数地址,

第三个虚表的内容是第三个基类虚函数的地址。


如果改为

class Derive: public Base3, Base2,Base1{
};

第一个虚表就是Base3的虚函数加上子类的虚函数;

可以总结多继承中每个基类都有自己的虚表,子类虚函数没有覆盖基类的虚函数时,子类的虚函数加在第一个基类(按继承顺序)虚函数的后面


有子类的虚函数覆盖时:

这里Base1的f()和Base3 的j()函数被覆盖

#include <iostream>
using namespace std;

typedef void (* pFun)(void);
class Base1{
public:
	virtual void e(){ cout<<"B1:: e()       "<<endl;}
	virtual void f(){ cout<<"B1:: f()       "<<endl;}
	virtual void g(){ cout<<"B1:: g()       "<<endl;}

};

class Base2{
public:
	virtual void h(){ cout<<"B2:: h()       "<<endl;}
	virtual void i(){ cout<<"B2:: i()       "<<endl;}
};

class Base3{
public:
	virtual void j(){ cout<<"B3:: j()       "<<endl;}

};


class Derive: public Base1,Base2,Base3{
public:
	Derive() {cout<<"sizeof(Derive) is : "<<sizeof(Derive)<<endl;}
	virtual void f(){cout<<"D::f()"<<endl;}
	virtual void k(){cout<<"D::k()"<<endl;}
	virtual void j(){cout<<"D::j()"<<endl;}




};


int main()
{
	Base1 base1;
	Base2 base2;
	Base3 base3;
	Derive derive;	
	for (int i=0; i<1; i++)
	{
	    pFun fun = (pFun)* ((int*)*((int*)&derive+2) + i);
	    fun();
	}
	

	
	return 0;
}

子类实例有三个虚表,分别打印




子类有每个基类的虚表(按照继承顺序排列),并且都遵循有覆盖的单继承的虚表规则,子类没有覆盖基类的虚函数

会按照声明顺序加在第一个虚表的后面。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏尔肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值