文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中菱形继承怎么处理

2023-06-29 02:31

关注

本篇内容介绍了“C++中菱形继承怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

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

C++中菱形继承怎么处理

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

C++中菱形继承怎么处理

该类图很明确的展示了类设计中的不足之处,在试图将指向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,在打印基类中的成员时编译器也会报以下错误:

C++中菱形继承怎么处理

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

答案是:虚基类。

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

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

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++中菱形继承怎么处理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯