C++类_虚基类
在 C++ 里,虚基类是用来解决菱形继承问题的。菱形继承问题是指当一个派生类从两个或更多基类派生,而这些基类又从同一个基类派生时,派生类会包含多份间接基类的数据副本,这可能会引发数据冗余和二义性问题。虚基类可以保证在派生类中只存在一份间接基类的数据副本。
下面是一个 C++11 中使用虚基类的例子:
#include <iostream>// 基类
class Animal {
public:Animal() {std::cout << "Animal constructor" << std::endl;}void eat() {std::cout << "Animal is eating" << std::endl;}
};// 中间派生类,使用虚继承
class Mammal : virtual public Animal {
public:Mammal() {std::cout << "Mammal constructor" << std::endl;}
};// 中间派生类,使用虚继承
class Bird : virtual public Animal {
public:Bird() {std::cout << "Bird constructor" << std::endl;}
};// 最终派生类,继承自 Mammal 和 Bird
class Bat : public Mammal, public Bird {
public:Bat() {std::cout << "Bat constructor" << std::endl;}
};int main() {Bat bat;bat.eat();return 0;
}
代码解释:
Animal类:这是最基础的类,有一个构造函数和eat方法。Mammal类和Bird类:它们都虚继承自Animal类,这意味着在后续的派生类中,Animal类的数据成员和成员函数只会有一份副本。Bat类:它从Mammal类和Bird类派生。由于Mammal和Bird是虚继承Animal,所以Bat类中只有一份Animal类的数据副本。main函数:创建一个Bat对象并调用eat方法。因为Bat类中只有一份Animal类的数据副本,所以调用eat方法时不会产生二义性。
运行这个程序,你会看到 Animal 类的构造函数只被调用了一次,这就表明在 Bat 类中只有一份 Animal 类的数据副本。
