zoukankan      html  css  js  c++  java
  • c++多继承

    0x00 前言

      这段时间学习c++,发现c++Java之间存在很多的共性与区别,其中继承就是一大共性。但是令我疑惑的是c++居然支持多继承,相对应的java继承只能有一个。Java不支持多继承但是可以通过接口一样可以实现多继承的功能。

    0x01 c++多继承使用

      一个类有多个基类,那么这种继承关系就叫做多继承。
    比如有两个类,服务员类Waiter,歌手类Singer,我们有一个类既是服务员,又是歌手,
    那么我们可以定义类的多继承关系如下:

     class Waiter

    {};

    class Singer

    {};

    class SingerWaiter:public Waiter,public Singer

    {};

    0x02 c++多继承引发的问题

    1)从两个不同的基类,继承同名方法

    如下例所示:

    class Waiter

    {

    public:

        void work(){std::cout<<"Service"<<std::endl;}

    };

    class Singer

    {

    public:

        void work(){std::cout<<"Sing"<<std::endl;}

    };

    class SingerWaiter:public Waiter,public Singer

    {};

    int main()

    {

        SingerWaiter singerWaiter;

        singerWaiter.work();

        return 0;

    }

    这回导致编译器不知道该调用哪个基类的work方法,所以会报singerWaiter.work();不明确错误。

    2)从两个不同的基类,继承同名方法

    从多个基类间接继承同一个类的多个实例如下例所示:

    class Worker

    {};

    class Waiter:public Worker

    {};

    class Singer:public Worker

    {};

    class SingerWaiter:public Waiter,public Singer

    {};

    int main()

    {

        SingerWaiter singerWaiter;

        Worker *pw = &singerWaiter;

        return 0;

    }

    会报错Worker *pw = &singerWaiter;基类Worker不明确。
    这是因为SingerWaiter对象创建时,会分别调用Waiter类和Singer类的构造函数,
    Waiter类和Singer类又会分别调用Worker类的构造函数,生成了两份Worker类的实例,
    所以pw指针,不知道该指向哪一份Worker实例。

    0x03 c++多继承问题解决方法

    对于问题一,我们在调用时,需要明确指出具体要调用哪个类的方法,如下所示:

    int main()

    {

        SingerWaiter singerWaiter;

        singerWaiter.Waiter::work();//调用Waiter类的方法

        singerWaiter.Singer::work();//调用Singer类的方法

        return 0;

    }

    对于问题二,我们引入了虚基类的概念。如下所示:

    class Worker

    {};

    class Waiter:virtual public Worker

    {};

    class Singer:virtual public Worker

    {};

    class SingerWaiter:public Waiter,public Singer

    {};

    int main()

    {

        SingerWaiter singerWaiter;

        Worker *pw = &singerWaiter;

        return 0;

    }

    我们在子类继承时,声明一个virtual关键字,这时,就表明基类Worker是一个虚基类。
    实例化SingerWaiter时产生的Waiter对象和Singer对象,共享一个基类Worker对象。

  • 相关阅读:
    Mysql索引优化
    [ExtJS5学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试
    [ExtJS5学习笔记]第五节 使用fontawesome给你的extjs5应用增加字体图标
    【翻译】Ext JS 5.0.1 中的新功能
    OpenCV——PS图层混合算法(六)
    [IDE工具配置]myeclipse 2014 专业版 安装 svn插件
    OpenCV——PS 图层混合算法 (四)
    [ExtJS5学习笔记]第四节 欢迎来到extjs5-手把手教你实现你的第一个应用
    [ExtJS5学习笔记]第三节 sencha cmd学习笔记 生成应用程序构建的内部细节
    [ExtJS5学习笔记]第二节 Sencha Cmd 学习笔记 使你的sencha cmd跑起来
  • 原文地址:https://www.cnblogs.com/2f28/p/9787992.html
Copyright © 2011-2022 走看看