用代码的角度看C++虚函数、虚继承的影响

本文从代码角度深入探讨C++中的虚函数和虚继承对类大小的影响,通过实例分析了不同继承组合下类的size变化,包括非对称情况和菱形继承结构。详细讨论了基类与派生类中虚函数的存在与否以及虚继承的使用如何改变类的内存布局。
摘要由CSDN通过智能技术生成

一直以来,c++的虚函数以及虚继承令人讨厌。下面通过程序彻底了解c++的虚函数以及虚继承。

#include <iostream>
using namespace std;
//查看虚函数表
classB{};
classB1
{
public:
B1(){cout<<"B1 constructor"<<endl;};//构造函数不能为virtual函数
};
classB2:public B1
{
public:
   B2(){cout<<"B2 constructor"<<endl;};//构造函数不能为virtual函数
   void f2(){ cout << "B2::f2" << endl; }
};
classB3:public B1
{
public:
B3(){cout<<"B3 constructor"<<endl;};//构造函数不能为virtual函数
void f3(){ cout << "B3::f3" << endl; }
};
 
classD :public B2,public  B3
{
public:
   D(){cout<<"D constructor"<<endl;};//构造函数不能为virtual函数
   void v3(){ cout << "D::v3" << endl; }
};
//=======================================
int main (int argc,constchar * argv[])
{
   cout<<sizeof(B)<<endl;
   cout<<sizeof(B1)<<endl;
   cout<<sizeof(B2)<<endl;
   cout<<sizeof(B3)<<endl;
   cout<<sizeof(D)<<endl;
   D* d=new D;
   B1* b1=new B1;
   B2* b2=new B2;
   B3* b3=new B3;
   d->v3();
   return 0;
}

基类中不含虚函数以及不使用虚拟继承时,基类与派生类的size都为1.运行上面的程序,可以看到下面的结果:

继续考虑虚继承对类size的影响。

#include <iostream>
using namespace std;
//查看虚函数表
classB{};
classB1
{
public:
B1(){cout<<"B1 constructor"<<endl;};
};
classB2:publicvirtual B1
{
public:
   B2(){cout<<"B2 constructor"<<endl;};
   void f2(){ cout << "B2::f2" << endl; }
};
classB3:public virtual B1
{
public:
B3(){cout<<"B3 constructor"<<endl;};
 voidf3(){ cout << "B3::f3"<< endl; }
};
classD :public B2,public  B3
{
public:
   D(){cout<<"D constructor"<<endl;};   void v3(){cout <<"D::v3" <<endl; }
};
//=======================================
intmain (int argc,constchar * argv[])
{
   cout<<sizeof(B)<<endl;
   cout<<sizeof(B1)<<endl;
   cout<<sizeof(B2)<<endl;
   cout<<sizeof(B3)<<endl;
   cout<<sizeof(D)<<endl;
   D* d=new D;
   B1* b1=new B1;
   B2* b2=new B2;
   B3* b3=new B3;
   d->v3();
   return 0;
}
运行程序,可以看到它的地址表格如下:

继承类虚拟继承基类时,继承类的size变成4,这是为什么???

而考虑菱形结构的虚继承的另外一种方式:

#include <iostream>
using namespace std;
//查看虚函数表
classB{};
classB1
{
public:
B1(){cout<<"B1 constructor"<<endl;};
};
classB2:public  B1
{
public:
   B2(){cout<<"B2 constructor"<<endl;};
   void f2(){ cout << "B2::f2" << endl; }
};
classB3:public B1
{
public:
B3(){cout<<"B3 constructor"<<endl;};
 voidf3(){ cout << "B3::f3"<< endl; }
};
 
classD :public virtual B2,publicvirtual B3
{
public:
   D(){cout<<"D constructor"<<endl;};   void v3(){cout <<"D::v3" <<endl; }
};
//=======================================
intmain (int argc,constchar * argv[])
{
   cout<<sizeof(B)<<endl;
   cout<<sizeof(B1)<<endl;
   cout<<sizeof(B2)<<endl;
   cout<<sizeof(B3)<<endl;
   cout<<sizeof(D)<<endl;
   D* d=new D;
   B1* b1=new B1;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值