zoukankan      html  css  js  c++  java
  • C++入门经典-例8.8-虚继承

    1:以前讲到从CBird类和CFish类派生子类CWaterBird时,在CWaterBird类中将存在两个CAnimal类的复制。那么如何在派生CWaterBird类时使其只存在一个CAnimal基类呢?C++语言提供的虚继承机制能够解决这个问题。

    代码如下:

    // 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;
    }
    View Code

    运行结果:

        上述代码中,在定义CBird类和CFish类时使用了关键字virtual,CFish类从基类CAnimal派生而来。实际上,虚继承对CBird类和CFish类没有多少影响,却对CWaterBird类产生了很大的影响。CWaterBird类中不再有两个CAnimal类的复制,而只存在一个CAnimal的复制。

        通常,在定义一个对象时,先依次调用基类的构造函数,最后才调用自身的构造函数。但是对于虚继承来说情况有些不同。在定义CWaterBird类的对象时,先调用基类CAnimal的构造函数,然后调用CBird类的构造函数,这里CBird类虽然为CAnimal的子类,但是在调用CBird类的构造函数时将不再调用CAnimal类的构造函数。对于CFish也是同样的道理。

  • 相关阅读:
    Windows Phone 7 开发之检查手机网络
    还原ipa里的png图片资源
    phpmyadmin 自动登录的办法
    Composer 是什么
    vuejs 和 element 搭建的一个后台管理界面
    Vue2 后台管理系统解决方案
    解决无限 This file is indented with tabs instead of 4 spaces
    无聊的小知识 规格严格
    va_list!!! 规格严格
    Java动态编译一个简单的例子(我转载的,但是经过修定,可以在Eclipse下运行) 规格严格
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7573830.html
Copyright © 2011-2022 走看看