C++ 多继承详情介绍

 更新时间:2022年03月02日 09:31:21   作者: 梁唐  
这篇文章主要介绍了C++ 多继承详情,C++支持多继承,即允许一个类同时继承多个类。只有C++等少数语言支持多继承,下面我们就来看看具体的多继承介绍吧,需要的朋友可以参考一下

C++支持多继承,即允许一个类同时继承多个类。

关于多继承,一直以来争议不断,有一部分人认为多继承会带来大量的问题,为了解决这些问题会使得语言本身变得非常复杂,因此应当避免。另外一派认为多继承在某些场景下可以起到非常关键的作用,应当予以支持。

关于多重继承是好是坏,这是一个非常复杂的问题,网上历来争议不断。因此不过多阐述,感兴趣的同学可以查阅一下相关资料。仅仅从实际支持来看,目前市面上大部分的语言包括Java仅支持单继承,只有C++等少数语言支持多继承。这和C++的理念也有关,即认定不能通过减少语言特性来增强语言的表达力。

看完争议之后,我们来看看究竟什么是多继承呢?

我们来看一段代码案例:

class A{
public:
    void funcA();
};

class B{
private:
    bool funcB() const;
};

class C: public A, public B{ ... };

在这段代码当中我们定义了两个类A和B,然后我们创建了一个类C,同时继承了A和B。这就是多继承,这里要注意一点,我们必须用关键字public来限定每一个基类,否则的话编译器会默认这是一个私有继承。

如果我们稍微修改一下代码,就会出现一些问题,比如:

class A{
public:
    void func();
};

class B{
private:
    bool func() const;
};

class C: public A, public B{ ... };

在上面这个例子当中A和B都包含了函数func,在下面的执行语句当中会报错。

C c;
c.func();

虽然B中的func函数是私有的,但对于编译器来说依然是有歧义的。如果想要消除歧义,我们可以这样调用c.A::func()。

当多继承的父类拥有更高的继承层级的时候,可能会出现更复杂的问题,比如多继承菱形。也就是多个类之间的继承关系构成了一个抽象意义上的菱形,

比如我们参考一下C++ Primer中的例子:

在上面这张图当中,SingerWaiter都继承了Worker,而SingingWaiter同时继承了Singer和Waiter。从图上来看,这似乎没什么问题,但在实现上问题不少。

比如说,对于SingingWaiter类来说,它当中包含了多少Worker呢?

答案是有两个,从Singer这边继承了一个Worker,从Waiter又继承了一个Worker。

那么我们这样写就会出现问题:

SingingWaiter sw;
Worker *p = &sw;

通常这种赋值的时候,会将基类指针设置成派生类中基类对象的地址,但由于sw对象当中包含两个Worker对象,有两个地址,所以也会导致歧义。

我们可以使用强制转换的方式消除歧义:

SingingWaiter sw;
Worker *p = (Singer*) &sw;
Worker *p = (Waiter*) &sw;

但显然这样的方法虽然能够解决问题,

到此这篇关于C++ 多继承详情介绍的文章就介绍到这了,更多相关C++ 多继承内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++选择排序详解

    c++选择排序详解

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从无序组的数据元素中选出最小(或最大)的一个元素,存放在无序组的起始位置,无序组元素减少,有序组元素增加,直到全部待排序的数据元素排完。
    2017-05-05
  • C++ override关键字使用详解

    C++ override关键字使用详解

    这篇文章主要介绍了C++ override关键字使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Opencv 马赛克和毛玻璃效果与图片融合的实现

    Opencv 马赛克和毛玻璃效果与图片融合的实现

    这篇文章主要为大家详细介绍了通过OpenCV实现马赛克和毛玻璃滤镜效果与图片的融合,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • dev c++的使用和调试方式

    dev c++的使用和调试方式

    这篇文章主要介绍了dev c++ 的使用和调试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • sdl显示一张bmp图片示例

    sdl显示一张bmp图片示例

    这篇文章主要介绍了sdl显示一张bmp图片示例,需要的朋友可以参考下
    2014-04-04
  • 基于C++实现去除字符串头尾指定字符功能

    基于C++实现去除字符串头尾指定字符功能

    编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格。本文为大家详细介绍了如何利用C++实现这一效果,需要的可以参考一下
    2022-04-04
  • C++11计时器之chrono库简介

    C++11计时器之chrono库简介

    C++11有了chrono库,可以在不同系统中很容易的实现定时功能,要使用chrono库,需要#include,其所有实现均在std::chrono namespace下,本文给大家介绍C++11计时器:chrono库介绍,感兴趣的朋友一起看看吧
    2023-12-12
  • 新手小心:c语言中强符号与弱符号的使用

    新手小心:c语言中强符号与弱符号的使用

    本篇文章适合新手。是对c语言中强符号与弱符号的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中rapidjson将map转为json的方法

    C++中rapidjson将map转为json的方法

    今天小编就为大家分享一篇关于C++中rapidjson将map转为json的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • C++ Qt开发之PushButton按钮组件的使用详解

    C++ Qt开发之PushButton按钮组件的使用详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,本文将重点介绍QPushButton按钮组件的常用方法及灵活运用,感兴趣的小伙伴可以学习一下
    2023-12-12

最新评论