首页 > 编程笔记 > C++笔记 阅读:4

C++虚继承的用法(附带实例)

假设 CBird 类和 CFish 类都继承自同一个 CAnimal 基类,则从 CBird 类和 CFish 类派生子类 CWaterBird 时,CWaterBird 类中将存在两个 CAnimal 类的拷贝。

能否使其只存在一个 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;
}
程序运行结果如下图所示:

动物类被构造
鸟类被构造
鱼类被构造
水鸟类被构造

本例中,定义 CBird 类和 CFish 类时使用了 virtual 关键字,说明两个类都是从基类 CAnimal 虚继承而来的。实际上,虚继承对 CBird 类和 CFish 类影响不大,但对 CWaterBird 类有影响,使其只存在一个 CAnimal 类的拷贝。

注意,实际开发中,多重继承虽然能带来很多方便,但却用得比较少,这是因为它会带来很多复杂的问题,而且其功能通过单继承同样可以实现。当下流行的 Java、C# 等面向对象开发语言都不再提供多重继承功能,而只允许单继承。

相关文章