C++虚继承的用法(附带实例)
假设 CBird 类和 CFish 类都继承自同一个 CAnimal 基类,则从 CBird 类和 CFish 类派生子类 CWaterBird 时,CWaterBird 类中将存在两个 CAnimal 类的拷贝。
能否使其只存在一个 CAnimal 基类呢?要解决该问题,需要使用虚继承机制。
【实例】哪个类被构造了。本实例要求使用虚继承,输出类的构造顺序。具体代码如下:
注意,实际开发中,多重继承虽然能带来很多方便,但却用得比较少,这是因为它会带来很多复杂的问题,而且其功能通过单继承同样可以实现。当下流行的 Java、C# 等面向对象开发语言都不再提供多重继承功能,而只允许单继承。
能否使其只存在一个 CAnimal 基类呢?要解决该问题,需要使用虚继承机制。
【实例】哪个类被构造了。本实例要求使用虚继承,输出类的构造顺序。具体代码如下:
#include <iostream> using namespace std; class CAnimal // 定义 CAnimal 类 { public: CAnimal() // 定义构造函数 { cout << "动物类被构造" << endl; } void Move() // 定义成员函数 Move() { cout << "动物能够移动" << endl; } }; class CBird : virtual public CAnimal // 定义 CBird 类,从 CAnimal 类虚继承 { public: CBird() // 定义构造函数 { cout << "鸟类被构造" << endl; } void FlyInSky() // 定义成员函数 FlyInSky() { cout << "鸟能够在天空飞翔" << endl; } void Breath() // 定义成员函数 Breath() { cout << "鸟能够呼吸" << endl; } }; class CFish : virtual public CAnimal // 定义 CFish 类,从 CAnimal 类虚继承 { public: CFish() // 定义构造函数 { cout << "鱼类被构造" << endl; } void SwimInWater() // 定义成员函数 SwimInWater() { cout << "鱼能够在水里游" << endl; } void Breath() // 定义成员函数 Breath() { cout << "鱼能够呼吸" << endl; } }; class CWaterBird : public CBird, public CFish // 定义 CWaterBird 类,继承自 CBird 和 CFish { public: CWaterBird() // 定义构造函数 { cout << "水鸟类被构造" << endl; } void Action() // 定义成员函数 Action() { cout << "水鸟既能飞又能游" << endl; } }; int main(int argc, char *argv[]) // 主函数 { CWaterBird waterbird; // 定义 CWaterBird 类对象 waterbird return 0; }程序运行结果如下图所示:
动物类被构造
鸟类被构造
鱼类被构造
水鸟类被构造
注意,实际开发中,多重继承虽然能带来很多方便,但却用得比较少,这是因为它会带来很多复杂的问题,而且其功能通过单继承同样可以实现。当下流行的 Java、C# 等面向对象开发语言都不再提供多重继承功能,而只允许单继承。