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

原文地址:https://www.cnblogs.com/2f28/p/9787992.html