C++ 虚基类,虚继承,菱形继承。

本文阐述了C++中虚拟继承的概念,通过将其共同基类设置为虚基类解决二义性和内存分配问题,实现数据一致性,同时节省内存资源。

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

C++中虚拟继承的概念

    为解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
class 派生类名:virtual 继承方式  基类名
在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。
声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。

C++虚拟继承

◇概念:

C++使用虚拟继承(Virtual Inheritance),解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。

 

◇解决问题:

解决了二义性问题,也节省了内存,避免了数据不一致的问题。
  
◇同义词: 
虚基类(把一个动词当成一个名词而已)
当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。

 

◇语法:

class 派生类: virtual 基类1,virtual 基类2,...,virtual 基类n

{

...//派生类成员声明

};

◇执行顺序

首先执行虚基类的构造函数,多个虚基类的构造函数按照被继承的顺序构造;

执行基类的构造函数,多个基类的构造函数按照被继承的顺序构造;

执行成员对象的构造函数,多个成员对象的构造函数按照申明的顺序构造;

执行派生类自己的构造函数;

析构以与构造相反的顺序执行;

mark

从虚基类直接或间接派生的派生类中的构造函数的成员初始化列表中都要列出对虚基类构造函数的调用。但只有用于建立对象的最派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。

在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。

 

◇因果:

多重继承->二义性->虚拟继承解决

#include "stdio.h"

class CBase
{
public:
	CBase(void)
	{
		m_Count = ms_Data ++;
		printf( "CBase Init...\r\n");
	}
	~CBase(void)
	{
		printf( "CBase Destroy...\r\n");
	}

	void foo()
	{
		printf( "Foo In Base...\r\n");
	}

	static int ms_Data;
	int m_Count;
};

class Fother : virtual public CBase
{
public:
	Fother()
	{
		printf( "Fother Init...\r\n");
	}
	~Fother()
	{
		printf( "Fother Destroy...\r\n");
	}
};

class Mother : virtual public CBase
{
public:
	Mother()
	{
		printf( "Mother Init...\r\n" );
	}
	~Mother()
	{
		printf( "Monter Destroy...\r\n" );
	}
};

class Child : public Fother, public Mother
{
public:
	Child()
	{
		printf( "Child Init...\r\n" );
	}
	~Child()
	{
		printf( "Child Destroy...\r\n");
	}
};


以上代码,若没有虚继承,Fother和Mother都继承自Base,则Child会有两份Base,因此,调用Base的foo函数也会引起二义性,访问Base中的成员变量也会引起二义性;

采用虚继承后,Child中仅有一份Base,消除了二义性,且节省了空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值