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
类的数据副本。