zoukankan      html  css  js  c++  java
  • C++中对C的扩展学习新增内容———面向对象(继承)多继承和虚继承

    多继承和虚继承

    1、多继承的优缺点

    (1) 多继承可以复用多个类的代码(函数,变量)。

    (2) 多继承会带来二义性问题。

    // 1. 多继承优缺点
    class Flyable
    {
    public:
        void fly()
        {
            cout << "飞翔..." << endl;
        }
    
        void sound()
        {
            cout << "嗖嗖..." << endl;
        }
    };
    
    
    class Runnable
    {
    public:
        void run()
        {
            cout << "跑步..." << endl;
        }
    
        void sound()
        {
            cout << "刺啦..." << endl;
        }
    };
    
    class SuperMan : public Flyable, public Runnable {};
    void test01()
    {
        SuperMan sm;
        sm.fly();
        sm.run();
    
        // 1. 多继承可以复用多个类的代码(函数、 变量)
        // 2. 多继承带来二义性问题.
        // sm.sound();
        sm.Flyable::sound();
        sm.Runnable::sound();
    }

    2、菱形继承问题

    1、菱形问题会造成空间浪费。

    2、菱形继承问题会产生二义性。

    // 2. 菱形继承问题
    class Animal
    {
    public:
        int m_animal;
    };
    
    class Sheep : public Animal 
    {
    public:
        int m_sheep;
    };
    
    class Tuo : public Animal
    {
    
    public:
        int m_tuo;
    };
    
    class SheepTuo : public Sheep, public Tuo
    {
    };
    
    void test02()
    {
        // 1. 空间浪费
        // 2. 二义性
        SheepTuo st;
        // st.m_animal;
    }

    3、虚继承

    (1) 当发生虚继承的时候,编译器会在子类中安插一个vbptr指针。

    (2) 指针指向一张记录着公共数据相对于vbptr指针的偏移量。

    (3) 根据偏移量就可以找到公共部分的数据。

    (4) 虚继承会带来程序额外的开销,但是解决了菱形继承的问题。

    (5) 虚继承中C++编译器要求没一个子类都能够初始化虚基类数据。

    (6) 虚继承主要是为了解决菱形继承问题,如果没有发生菱形继承问题,不建议使用虚继承。

    (7) 不建议大家大量使用多继承,允许多接口继承一般不会多继承(任何多继承问题都可以用单继承来解决)

    // 3. 虚继承 使用virtual关键字
    
    class Animal
    {
    public:
        Animal(int)
        {
        
        }
    public:
        int m_animal;
    };
    
    class Sheep :  virtual public Animal
    {
    public:
        Sheep() : Animal(10) {}
    public:
        int m_sheep;
    };
    
    class Tuo : virtual public Animal
    {
    public:
        Tuo() : Animal(10) {}
    public:
        int m_tuo;
    };
    
    class SheepTuo : public Sheep, public Tuo 
    {
    public:
        SheepTuo() : Animal(10) {}
    };
    
    void test03()
    {
        SheepTuo st;
        st.m_animal;
        st.Sheep::m_animal;
        st.Tuo::m_animal;
    
        Sheep s;
        s.m_animal;
    }
  • 相关阅读:
    js调试工具Console命令详解
    tomcat如何正确的开启远程调试功能
    Cleanup failed to process the following paths错误的解决
    MySQL查看SQL语句执行效率
    MYSQL 的静态表和动态表的区别, MYISAM 和 INNODB 的区别
    JAX-RS之queryparam、PathParam、DefaultValue、FormParam、Context、RestController等
    C语言中的printf函数的输入输出问题
    leetcode 21.Merge Two Sorted Lists ,java
    初识C++ 中的STL
    leetcode 58.Length of Last Word
  • 原文地址:https://www.cnblogs.com/yyslif/p/11758754.html
Copyright © 2011-2022 走看看