第17章 用于大型程序的工具(15)

本文深入探讨了C++中虚继承的概念、作用及其在类层次结构中的应用,包括如何声明虚基类、虚基类的初始化含义以及与非虚基类的构造函数次序。此外,阐述了虚基类在解决多重继承问题时的优势,以及虚基类的声明对成员可见性和常规转换的影响。

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

17.3.5 虚继承

在C++中,通过使用虚继承(virtual inheritance)解决这类问题。虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态。在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。共享的基类子对象称为虚基类(virtual base class)。

通过在派生列表中包含关键字virtual设置虚基类。

namespace Andersoft
{
	namespace Animal
	{
		class ZooAnimal{
		};
		class Endangered{
		};
		class Bear:virtual public ZooAnimal{
		};
		class Raccon:virtual public ZooAnimal{
		};
		class Panda:public Bear,public Endangered, public Raccon{
		public:
			Panda():Bear(),Endangered(),Raccon(){}
		};
	}
}
实际上,中间基类指定其继承为虚继承的要求很少引起任何问题。通常,使用虚继承的类层次是一次性由一个人或一个项目设计组设计的,独立开发的类很少需要其基类中的一个是虚基类,而且新基类的开发者不能改变已经存在的层次。

17.3.6 虚基类的声明

通过关键字virtual修改声明,将基类指定为通过虚继承派生。

		class ZooAnimal{
		};
		class Endangered{
		};
		class Bear:virtual public ZooAnimal{
		};
		class Raccon:virtual public ZooAnimal{
		};
		class Panda:public Bear,public Endangered, public Raccon{
		public:
			Panda():Bear(),Endangered(),Raccon(){}
		};
指定虚派生只影响从指定了虚基类的类派生的类。除了影响派生类自己的对象之外,它也是关于派生类与自己的未来派生类的关系的一个陈述。

virtual说明符陈述了在后代派生类中共享指定基类的单个实例的愿望。

任何可被指定为基类的类也可以被指定为虚基类,虚基类可以包含通常由非虚基类支持的任意类元素。

1. 支持到基类的常规转换

即使基类是虚基类,也通常可以通过基类类型的指针或引用操纵派生类的对象。

2. 虚基类成员的可见性

使用虚函数的多重继承层次比没有虚继承的引起更少的二义性问题。

可以无二义性地直接访问共享虚基类中的成员。同样,如果只沿一个派生路径重定义来自虚基类的成员,则可以直接访问该重定义成员。在非虚派生情况下,两种访问都可能是二义性的。

如果在某个路径中x是虚基类的成员,而在另一路径中x是后代派生类的成员,也没有二义性——特定派生类实例的优先级高于共享虚基类实例。

17.3.7 特殊的初始化含义

在虚派生中,由最低层派生类的构造函数初始化虚基类。

虽然由最低层派生类初始化虚基类,但是任何直接或间接继承虚基类的类一般也必须为该基类提供自己的初始化式。只要可以创建虚基类派生类类型的独立对象,该类就必须初始化自己的虚基类,这些初始化式只在创建中间类型的对象时使用。

2. 构造函数与析构函数次序

无论虚基类出现在继承层次中任何地方,总是在构造非虚基类之前构造虚基类。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值