C++入门经典-例8.8-虚继承
1:以前讲到从CBird类和CFish类派生子类CWaterBird时,在CWaterBird类中将存在两个CAnimal类的复制。那么如何在派生CWaterBird类时使其只存在一个CAnimal基类呢?C++语言提供的虚继承机制能够解决这个问题。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 8.8.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; class CAnimal //定义一个动物类 { public: CAnimal() //定义构造函数 { cout << "动物类被构造"<< endl; //输出信息 } void Move() //定义成员函数 { cout << "动物能够移动"<< endl; //输出信息 } }; class CBird : virtual public CAnimal //从CAnimal类虚继承CBird类 { public: CBird() //定义构造函数 { cout << "鸟类被构造"<< endl; //输出信息 } void FlyInSky() //定义成员函数 { cout << "鸟能够在天空飞翔"<< endl; //输出信息 } void Breath() //定义成员函数 { cout << "鸟能够呼吸"<< endl; //输出信息 } }; class CFish: virtual public CAnimal //从CAnimal类虚继承CFish { public: CFish() //定义构造函数 { cout << "鱼类被构造"<< endl; //输出信息 } void SwimInWater() //定义成员函数 { cout << "鱼能够在水里游"<< endl; //输出信息 } void Breath() //定义成员函数 { cout << "鱼能够呼吸"<< endl; //输出信息 } }; class CWaterBird: public CBird, public CFish //从CBird和CFish类派生子类CWaterBird { public: CWaterBird() //定义构造函数 { cout << "水鸟类被构造"<< endl; //输出信息 } void Action() //定义成员函数 { cout << "水鸟既能飞又能游"<< endl; //输出信息 } }; int main(int argc, char* argv[]) //主函数 { CWaterBird waterbird; //定义水鸟对象 return 0; }
运行结果:
上述代码中,在定义CBird类和CFish类时使用了关键字virtual,CFish类从基类CAnimal派生而来。实际上,虚继承对CBird类和CFish类没有多少影响,却对CWaterBird类产生了很大的影响。CWaterBird类中不再有两个CAnimal类的复制,而只存在一个CAnimal的复制。
通常,在定义一个对象时,先依次调用基类的构造函数,最后才调用自身的构造函数。但是对于虚继承来说情况有些不同。在定义CWaterBird类的对象时,先调用基类CAnimal的构造函数,然后调用CBird类的构造函数,这里CBird类虽然为CAnimal的子类,但是在调用CBird类的构造函数时将不再调用CAnimal类的构造函数。对于CFish也是同样的道理。
本博文由Leon Zhang原创,若转载,请注明出处。