多重继承(multiple inheritance,MI)。
MI可能会给程序带来很多问题,其中两个主要的问题是:从两个不同的基类继承同名方法;从两个或更多相关基类那里继承同一个类的多个实例。
虚基类
虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。通过使用关键字virtual。
MI可能会给程序带来很多问题,其中两个主要的问题是:从两个不同的基类继承同名方法;从两个或更多相关基类那里继承同一个类的多个实例。
虚基类
虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。通过使用关键字virtual。
例如,可以使Worker被用作Singer和Waiter的虚基类(virtual和public的次序无关紧要)。
当基类是虚基类,派生类将包含基类的一个子对象;如果基类不是虚基类,派生类将包含多个子对象。当类通过多条虚途径和非虚途径继承某个特定的基类时,该类将包含一个表示所有的虚途径的基类子对象和分别表示各条非虚途径的多个基类子对象。
使用非虚基类时,如果类从不同的类那里继承了两个或更多的同名成员(数据或方法),则使用该成员名时,如果没有用类名进行限定,将导致二义性。但如果使用了虚基类,则不一定会导致二义性。这时,如果某个名称优先于(dominate)其它所有名称,则使用它时,即使不用限定符,也不会导致二义性。
派生类中的名称优先于直接或间接祖先类中的相同名称。
class B
{
public:
short q();
...
};
class C:virtual public B
{
public:
long q();
int omb();
...
};
class D:public C
{...};
class E:virtual public B
{
private:
int omb();
...
};
class F:public D,public E
{
...
}