广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中菱形继承的解释与处理详解
  • 477
分享到

C++中菱形继承的解释与处理详解

2024-04-02 19:04:59 477人浏览 泡泡鱼
摘要

封装,继承,多态。这是c++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。 派生类继承父类,同时也会继承父类中的所有成员

封装,继承,多态。这是c++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。

派生类继承父类,同时也会继承父类中的所有成员副本,但如果在继承时一个基类同时被两个子类继承,然后一个新类又分别由上面的两个子类派生出来。这样从某种程度来说就形成了C++中的菱形继承,也可以叫做钻石继承,具体的继承形式如下图所示:

在上面的类图说,Left和Right分别派生子Top,但是Bottom又分别继承了Left和Right。继承关系也可以画成下面的方式,这样就可以更好的理解设计中存在的问题。

该类图很明确的展示了类设计中的不足之处,在试图将指向Bottom对象的指针转换成指向Top的指针时,有两个Top对象可供选择,但是编译器却明显没有那么智能,从而导致了转换过程中的二义性;同理,Bottom对象也不能直接调用Top中定义的方法,如果要使用需要提供一个Top子对象,但是从类图可知存在两个Top对象。

上面的类对应的代码为:

class Top{
public:
    int _x;
public:
    Top(int x):_x(x){};
};
class Left:public Top{
public:
    int _y;
public:
    Left(int x,int y):Top(x),_y(y){}
};
class Right:public Top{
public:
    int _z;
public:
    Right(int x,int z):Top(x),_z(z){}
};
class Bottom:public Left,public Right{
public:
    int _w;
public:
    Bottom(int x,int y,int z,int w):Left(x,z),Right(y,z),_w(w){};
};

下面实现该类的测试程序,如下所示:

int main()
{
    Bottom bf(1,2,3,4);
    cout<<sizeof(bf)<<endl;
    return 0;
}

运行结果为:20,在打印基类中的成员时编译器也会报以下错误:

既然在上面的类的设计中存在问题,在实际编程时如何避免这个问题呢?

答案是:虚基类。

虚基类给在确实需要使用菱形继承的地方提供了一个很好的解决方法,通过子类共享一个基类对象避免基类对象的二义性问题。

上面的代码修改后代码如下:

using namespace std;
class Top{
public:
    int _x;
public:
    Top(int x):_x(x){};
    virtual ~Top(){};
};
class Left:virtual public Top{
public:
    int _y;
public:
    Left(int x,int y):Top(x),_y(y){}
};
class Right:virtual public Top{
public:
    int _z;
public:
    Right(int x,int z):Top(x),_z(z){}
};
class Bottom:public Left,public Right{
public:
    int _w;
public:
    Bottom(int x,int y,int z,int w):Top(x),Left(x,y),Right(x,z),_w(w){};
};

在main函数中继续测试上述类,则可以正常输出,代码如下:

int main()
{
    Bottom bf(1,2,3,4);
    cout<<bf._x<<","<<bf._y<<","<<bf._z<<","<<bf._w<<endl;
    return 0;
}

运行结果为:

从上面的示例可以看出,在使用多进程时如果不对类进行提前规划,将可能产生菱形继承这种场景,给实际的编程带来不便。因此在实际编码时,我建议尽量减少多继承的方式更多地使用嵌套类的方式。

总结

到此这篇关于C++中菱形继承的解释与处理的文章就介绍到这了,更多相关C++菱形继承内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++中菱形继承的解释与处理详解

本文链接: https://www.lsjlt.com/news/138343.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中菱形继承的解释与处理详解
    封装,继承,多态。这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。 派生类继承父类,同时也会继承父类中的所有成员...
    99+
    2022-11-13
  • 详解C++中菱形继承的原理与解决方法
    目录菱形继承形成原因应对方案虚继承 vitrual解决二义性变量内存布局–虚基表感悟菱形继承形成原因 多继承,呈菱形状 菱形继承代码: class A { publi...
    99+
    2023-02-01
    C++菱形继承原理 C++菱形继承解决方法 C++菱形继承
  • C++中菱形继承怎么处理
    本篇内容介绍了“C++中菱形继承怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!封装,继承,多态。这是C++语言的三大特性,而每次在谈...
    99+
    2023-06-29
  • C++继承的赋值转换与菱形虚拟继承深入详解
    目录一、继承的概念及定义1.1、继承的概念1.2、继承的定义二、基类和派生类对象赋值转换三、继承中的作用域3.1、继承同名成员处理方式3.2、继承同名静态成员处理方式3.3、继承与友...
    99+
    2022-11-13
    C++继承的赋值转换 C++菱形虚拟继承
  • 详解C++中单继承与多继承的使用
    目录前言1.继承的概念和定义(1)继承的概念(2)继承的定义方法(2)继承后子类的成员类型2.基类与派生类的赋值转换(1)派生类赋值给基类(2)基类给派生类3.继承中的作用域(1)隐...
    99+
    2022-11-13
  • C#中的类继承详解
    目录前言类的继承注意事项寄语总结前言 在日常的程序编码工作中,我们的最终目标是完成公司交给自己的开发任务,核心目标是写出好代码。 那么什么是好代码? 高内聚,低耦合 想必从事编码工作...
    99+
    2022-11-13
  • C++中继承与组合的区别详细解析
    C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们要给“继承”立一些使用规则: 一、如果类A 和类B 毫不相关,不可以为了使B 的...
    99+
    2022-11-15
    继承 组合
  • C++中的继承模式深入详解
    前言 继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。 一、继承...
    99+
    2022-11-11
  • Python中类的mro与继承关系详解
    目录前言类继承mro总结前言 版本: windows 10.0python 3.8 类 在Python数字比较与类结构中有简略提到类,那么什么是类呢? 在python中定义一个类很简...
    99+
    2022-11-11
  • Python中类的mro与继承关系详解(二)
    目录前言多重继承思考片刻总结前言 版本: windows 10.0python 3.8 多重继承 在Python数字比较与类结构中有简略提到类,且在Python中类的mro与继承关系...
    99+
    2022-11-11
  • 详解Java语言中的抽象类与继承
    目录一、实验目的二、实验要求三、实验报告要求四、实验小结一、实验目的 1、掌握抽象类的设计; 2、掌握抽象方法方法的实现; 3、熟悉类的向下向上转型,以及子类实例化父类对象的基本要求...
    99+
    2022-11-13
    Java抽象类 继承 Java抽象类 Java 继承
  • C++中的三种继承public,protected,private详细解析
    三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 三种继承方式 public 继承 pro...
    99+
    2022-11-15
    public protected private
  • C++中的类扩展之继承和组合详解
    目录相关术语一、继承二、组合相关术语 继承:继承父类后可以拥有父类对应的属性和方法。 组合:将类作为成员对象,基类可以直接调用派生类对应的属性和方法。 一、继承 继承是指在一个已有的...
    99+
    2023-05-17
    C++类扩展 C++继承 C++组合
  • C++继承中的对象构造与析构和赋值重载详解
    目录一、构造/析构顺序及继承性二、拷贝构造的继承性三、赋值重载不具有继承性总结一、构造/析构顺序及继承性 class A { private: int _a; public: A...
    99+
    2022-11-13
  • 详解Java面向对象中的继承与多态
    详解Java面向对象中的继承与多态?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 继承与多态的深入理解1、  什么是继承,继承的特点?子类继承父类的特征和...
    99+
    2023-05-31
    java 面向对象 ava
  • 一篇文章带你详细理解java中类的继承与多态
    类的继承子类及其定义子类的定义使用关键字extends格式:class SubClass extends SuperClass{ ........ }子类可以继承父类的属性和方法;子类不能继承带private修饰符的属性,方法;子类不能继承...
    99+
    2017-08-28
    java入门 java 继承 多态
  • Java 多态中继承的转型详解与用法分析
    目录一、前言二、转型向上转型向下转型三、instanceof运算符instanceof的用处instanceof的使用格式:一、前言 前面我们学习了多态的概述和使用,现在我们来学习前...
    99+
    2022-11-12
  • C#中类的异常处理详解
    目录前言异常寄语总结前言 日常编码过程中,最重要的技能不是说你学会使用很多最新的编程技术或者做出一个高大上的系统。而是你在写代码过程中,对异常的处理,是否系统可以稳定,健壮。 对于异...
    99+
    2022-11-13
  • c语言的程序环境与预处理详解
    目录1.翻译环境2.运行环境3.预处理详解3.1#define定义的符号3.2#define定义的宏3.3#define的替换规则3.4#与##4.宏与函数对比5.#undef6.条...
    99+
    2022-11-13
  • C语言程序的编译与预处理详解
    目录一、程序的编译1、 编译阶段2、链接二、预处理详解1、预定义符号2、#define定义的标识符3、#define定义的宏4、#unef总结一、程序的编译 我们写的源文件(*.c)...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作