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

  • 相关阅读:
    chkconfig命令
    Office 2010 与搜狗输入法兼容问题
    【转】WAS入门简介
    UTF8GB2312GBK
    System.getProperty
    Hibernate 事务方法保存clob类型数据
    Eclipse 或者 Myeclipse 提示选择工作空间设置
    request
    那些操蛋的人生
    Java新手入门很重要的几个基本概念
  • 原文地址:https://www.cnblogs.com/2f28/p/9787992.html
Copyright © 2020-2023  润新知