zoukankan      html  css  js  c++  java
  • *** C++多重继承

    #include <iostream>
    #include <complex>
    using namespace std;
    
    class Person
    {
    public:
        void eat(void)
        {
            cout << "Person->eat" << endl;
        }
    };
    
    class Author: virtual public Person
    {
    public:
        void write(void)
        {
            cout << "Auther->write" << endl;
        }
    };
    
    class Singer: virtualpublic Person
    {
    public:
        void sing(void)
        {
            cout << "Singer->sing" << endl;
        }
    };
    
    class Author_Singer: public Author, public Singer
    {
    public:
        void doSth(void)
        {
            cout << "AuthorSinger->doSth" << endl;
        }
    };
    
    
    int main()
    {
        Author_Singer pp;
        pp.doSth();
        pp.write();
        pp.sing();
        pp.eat();
        //pp.Author::eat();
        
        return 0;
    }

    代码中Author和Singer以virtual方式继承Person,解决了Author_Singer实例拥有两份Person copy的问题,这是一种解决方法。

    另一种方法是明确指定引用的子类:pp.Author::eat();

    下面代码显示了,使用和不使用virtual来继承基类时,各个类的构造函数的执行情况

    #include <iostream>
    
    using namespace std;
    
    class A
    {
    public:
        A()
        {
            cout << "A" << endl;
        }
    };
    
    class B: public A
    {
    public:
        B()
        {
            cout << "B" << endl;
        }
    };
    
    class C: public A
    {
    public:
        C()
        {
            cout << "C" << endl;
        }
    };
    
    class D: public C, public B
    {
    public:
        D()
        {
            cout << "D" << endl;
        }
    };
    
    int main()
    {
        D d;
        
        return 0;
    }

    执行输出结果是:

    A

    C

    A

    B

    D

    当类B, C采用virtual继承A后,代码如下

    #include <iostream>
    
    using namespace std;
    
    class A
    {
    public:
        A()
        {
            cout << "A" << endl;
        }
    };
    
    class B: virtual public A
    {
    public:
        B()
        {
            cout << "B" << endl;
        }
    };
    
    class C: virtual public A
    {
    public:
        C()
        {
            cout << "C" << endl;
        }
    };
    
    class D: public C, public B
    {
    public:
        D()
        {
            cout << "D" << endl;
        }
    };
    
    int main()
    {
        D d;
        
        return 0;
    }

    执行结果为:

    A

    C

    B

    D

    注意:构造函数的执行顺序与继承列表中顺序一致

  • 相关阅读:
    angular 三大核心函数
    mongodb 怎样检测 安装成功 以及mongodb的一些增删改查命令
    前端自动化工具 -- gulp https://angularjs.org/
    ECMAscript一些方法的使用
    HBuilder使用技巧
    angular 本地存储
    WPF控件开发(2) 自动完成(AutoComplete)-1
    orecle查询关键字段存在的存储过程或Job
    flash 反编译 + 重新发布
    javascript高级程序设计--简介
  • 原文地址:https://www.cnblogs.com/superrunner/p/10146291.html
Copyright © 2011-2022 走看看