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对象。

  • 相关阅读:
    【Manacher(马拉车)算法】
    【可持久化数据结构】
    react-dva修改默认端口的方法
    关于React Hooks使用
    react hook useContext 跨文件接收
    el-select中使用el-tooltip时,在下拉滚动时整个网页会出现滚动条,并抖动
    react的onClick执行函数和bind(this)问题
    禁用h5页面中长按图片弹出的弹层
    JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换
    js树结构查找节点
  • 原文地址:https://www.cnblogs.com/2f28/p/9787992.html
Copyright © 2011-2022 走看看