多重继承
多重继承是指从多个直接基类中产生派生类的能力,在派生类的派生列表中可以包含多个基类,同一个基类只能出现一次。
在多重继承关系中,派生类对象包含有每个基类的子对象,派生类的构造函数初始值列表将实参传递给每个直接基类,其中基类的构造顺序与派生列表中基类出现顺序保持一致。
如果一个类从它的多个基类中继承了相同的构造函数,则这个类必须为该构造函数定义它自己的版本,否则会报错。
与只有一个基类的情况一样,多重继承下的派生类的指针或引用能自动转换成一个可访问基类的指针或引用。
当派生类从多个基类中继承了同名的成员,不加前缀限定符直接使用该名字将引发二议性。
class ClassA
{
public:
void funcA()
{
std::cout << "funcA" << std::endl;
}
};
class ClassB
{
public:
void funcB()
{
std::cout << "funcB" << std::endl;
}
};
class ClassC
{
public:
void funcC()
{
std::cout << "funcC" << std::endl;
}
};
class Worker :public ClassA,public ClassB, public ClassC
{
};
int main(void)
{
Worker worker;
worker.funcA();
worker.funcB();
worker.funcC();
system("pause");
return 0;
}
虚继承
尽管派生列表中一个基类只能出现一次,但实际上派生类可以多次继承同一个类,派生类可以通过它的两个直接基类分别继承同一个基类。在这种情况下,派生类将包含该类的多个子对象。
在C++中,我们通过虚继承解决这个问题,虚继承的目的是令某个类做出声明,承诺愿意共享它的基类,其中共享的基类子对象被称为虚基类。不论虚基类在继承体系中出现了多少次,在派生类中都只包含唯一一个共享的虚基类子对象。我们通过在派生列表中添加关键字virtual来指定虚基类。
虚基类是由最低层的派生类初始化的,即使虚基类不是派生类的直接基类,派生类的构造函数也可以初始化虚基类,含有虚基类的对象在构造时,首先会初始化虚基类部分,接下来才按照直接基类在派生列表中出现的次序进行初始化。
class ClassA
{
public:
ClassA(int height):height_(height) {};
void funcA()
{
std::cout << "funcA" << std::endl;
}
private:
int height_;
};
class ClassB:public virtual ClassA
{
public:
ClassB():ClassA(10)
{
}
void funcB()
{
std::cout << "funcB" << std::endl;
}
};
class ClassC :public virtual ClassA
{
public:
ClassC() :ClassA(100)
{
}
void funcC()
{
std::cout << "funcC" << std::endl;
}
};
class Worker :public ClassB, public ClassC
{
public:
Worker():ClassA(8)
{
}
};