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

  • 相关阅读:
    css透明度的兼容!!!
    csshtml布局及部分知识小分享~~~
    js面向对象选项卡
    JQ弹出框移动-插件分享~~~
    nginx配置phpcms v9伪静态规则 phpcms伪静态 404 Not Found
    mysql数据库常见优化方法
    帝国ECMS静态生成为一行代码/静态页面打乱教程
    帝国cms 批量删除或者清空classurl(二级域名绑定)
    jquery实现一个网页同时调用多个倒计时
    PHPCMSV9 单文件上传功能代码
  • 原文地址:https://www.cnblogs.com/2f28/p/9787992.html
Copyright © 2020-2023  润新知