zoukankan      html  css  js  c++  java
  • C++入门--菱形继承与虚继承

    看一个菱形继承的例子:

                           家具类

                           /         

                         /             

                      沙发          床

                                       /

                                     /

                             沙发床

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class CFurniture {
    public:
        CFurniture() {
            cout << "CFurniture()
    ";
            m_nFurniture = 0;
        }
        void use() {};
        int m_nFurniture;
    };
    
    class CSofa:public CFurniture {
    public:
        CSofa() {
            m_nSofa = 1;
            cout << "CSofa()
    ";
        }
        ~CSofa() { cout << "~CSofa()
    "; }
        void sit() { cout << "sit()
    "; }
    private:
        int m_nSofa;
    };
    
    class CBed:public CFurniture {
    public:
        CBed() {
            m_nBed = 2;
            cout << "CBed()
    ";
        }
        ~CBed() { cout << "~CBed()
    "; }
        void sleep() { cout << "sleep()
    "; }
    private:
        int m_nBed;
    };
    
    //构造新类,既有sofa特点,又有bed的特点--->多重继承
    class CSofaBed :public CSofa, public CBed {
    public:
        CSofaBed() { cout << "CSofaBed()
    "; }
        ~CSofaBed() { cout << "~CSofaBed()
    "; }
    };
    
    int main() 
    {
        //创建沙发床对象
        CSofaBed sofaBed;
        //调用不明确,sofa和bed中都继承了家具类的m_nFurniture
        //sofaBed.m_nFurniture = 3;
        //指定类域(其实sofaBed本应只有一个m_nFurniture变量,但是由于菱形继承造成了这个
        //天生的漏洞,因此C++提出了虚继承以规避此问题)
        sofaBed.CSofa::m_nFurniture = 1;
        sofaBed.CBed::m_nFurniture = 1;
    
        
    
    
        return 0;
    }

    为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。
    在继承方式前面加上 virtual 关键字就是虚继承,被共享的基类就是虚基类

    class CSofa:virtual public Furniture 
    
    class CBed:virtual public CFurniture

    不提倡在程序中使用多继承,只有在比较简单和不易出现二义性的情况或实在必要时才使用多继承,能用单一继承解决的问题就不要使用多继承。也正是由于这个原因,C++ 之后的很多面向对象的编程语言,例如 JavaC#PHP 等,都不支持多继承。

  • 相关阅读:
    Git安装及配置-拉取远程仓库代码
    Leangoo领歌敏捷项目管理工具新增测试管理功能
    Xcode中的Vim--XVim
    npm安装报错:源文本中存在无法识别的标记
    给找不到类型文件的依赖增加TypeScript类型声明
    输入框为空时,按钮灰色不可点
    Django settings.py设置 DEBUG=False后静态文件无法加载解决
    mongodb系列~开发规范
    mongodb系列~升级版本
    CIM基础平台性能指标
  • 原文地址:https://www.cnblogs.com/y4247464/p/13832527.html
Copyright © 2011-2022 走看看