虚基类解决副本重复

博客介绍了C++虚基类技术。在派生类对象中,同名基类可能存在多个副本,会引发二义性问题。而虚基类技术可解决此问题,将共同基类设为虚基类,同名数据成员在内存中只有一个空间,函数也只有一个映射,构造派生类对象时基类只构造一次。

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

虚基类

  • 对于前面同名隐藏和二义性的例子,在内存中,派生类对象c同时拥有两个a的空间。这两个a可以分别通过B1和B2调用基类A的构造函数进行初始化,能够存放不同的数值;也可以使用作用域操作符通过直接基类进行区分,分别进行访问。但是在大多数情况下,我们不需要两个同名副本,只需要保留一个即可,C++提供了虚基类技术来解决此问题。
  • 在前面的例子中,当我们定义一个派生类对象c时,它会构造B1类,B2类,B1,B2类都会有一个父类,因此A类被构造了两次。在c中,A中的数据成员a有两个副本,A中的成员函数fun0()也有两个映射。一般可以将共同基类A设置为虚基类,这时从不同路径继承过来的同名数据成员在内存中就只有一个空间,同一个函数名也只有一个映射,在构造派生类对象c时,A类只会构造一次。
  • class B1:virtual public A{}; class B2:virtual public A{};
  • 虚基类并不是将基类声明为虚基类,只是在类的派生过程中使用了virtual关键字。
#include <iostream>

using namespace std;

class A{
	public:
		int a;
		void fun0()
		{
			cout<<"A function is called."<<endl;
		}
		A(){ cout<<"construct A"<<endl; }  
		~A(){ cout<<"destruct A"<<endl; }
};

class B1:virtual public A{
	public:
		int b1;
		B1(){ cout<<"construct B1"<<endl; }  
		~B1(){ cout<<"destruct B1"<<endl; }
};

class B2:virtual public A{
	public:
		int b2;
		B2(){ cout<<"construct B2"<<endl; }  
		~B2(){ cout<<"destruct B2"<<endl; }
};

class C:public B1,public B2{
	public:
		int b1;
		C(){ cout<<"construct C"<<endl; }  
		~C(){ cout<<"destruct C"<<endl; }
		void fun()
		{
			cout<<"C function is called."<<endl;
		}
};

int main()
{
	C c;
	c.a=10;  //只有一个副本,不存在二义性访问问题
	c.fun0();
	return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值