第17章 用于大型程序的工具(15)
上一篇:http://www.zzzyk.com/kf/201201/115850.html17.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(){}
};
}
}
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(){}
};
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. 构造函数与析构函数次序
无论虚基类出现在继承层次中任何地方,总是在构造非虚基类之前构造虚基类。
摘自 xufei96的专栏
补充:软件开发 , C++ ,