当前位置:  编程技术>c/c++/嵌入式

C++多重继承与虚继承分析

    来源: 互联网  发布时间:2014-10-27

    本文导语:  本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下: 一、多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义...

本文以实例形式较为全面的讲述了C++的多重继承与虚继承,是大家深入学习C++面向对象程序设计所必须要掌握的知识点,具体内容如下:

一、多重继承

我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分。同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义成员的子对象。下面是一个多重继承关系图:

class A{ /* */ }; 
class B{ /* */ };  
class C : public A { /* */ }; 
class D : public B, public C { /* */ }; 

C继承了A,派生类D又继承了B和C,如图所示,一个D对象中含有一个B部分、一个C部分(其中又含有一个A部分)以及在D中声明的非静态数据成员:

构造与析构:

构造一个派生类对象将首先构造它的所有基类子对象,其中基类的构造顺序与派生列表中基类的出现顺序保持一致,即B –> A –> C –> D。
销毁一个派生类对象的顺序正好与其创建的顺序相反,即析构函数的调用顺序正好与构造函数相反,即D –> C –> A –> B。注意派生类的析构函数只负责清除派生类本身分配的资源(析构函数体),派生类的成员及基类都是自动销毁的(隐式析构阶段)。

类型转换:

在多重继承的情况下,可以令某个可访问基类的指针或引用直接指向一个派生类对象。编译器不会在派生类向基类的几种转换中进行比较和选择,在它看来转换到任意一种基类都一样好。

二、虚继承

尽管在派生列表中不允许同一个基类出现两次,但实际上派生类可以多次继承同一个类。

派生类通常会含有继承链上每个类对应的子部分。在上面的两种情况中,class D都间接地继承了class A两次,那么意味着class D中包含了class A的两份拷贝。所以在一个class D的对象中将含有2组class A的成员,此时若不加前缀限定符直接使用某个成员将引发“二义性”错误:

class A{ 
public: 
  A():str("name"){}; 
  string str; 
  void print(){cout 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java没有多继承,用接口来实现多继承的功能,但哪里体现了多继承啊?我对接口的概念一直弄不清楚,请大家帮忙!
  • java继承的问题
  • 子进程继承锁的问题
  • 问一个很蠢的问题:什么是重载,继承,实例,派生,接口
  • 关于类的继承问题!着急!
  • 关于java的访问控制和继承,这段话怎么理解?
  • 接口继承类是怎么一回事?
  • 如何使JPanel中的一个继承JPanel的组件的尺寸发生动态改变???
  • 想继承统一软件包里的类怎么办?
  • 关于多重继承问题的答谢,请pengji(彭乃超)来领分!
  • 关于多重继承问题的答谢,请ajoo(jet pig)来领分!
  • 关于多重继承问题的答谢,请mygarfield((我被CSDN封杀过)) 来领分!
  • 关于多重继承问题的答谢,请Dickensi(流星·逐日)(★★★★) 来领分!
  • 如何让exec出的进程继承原来打开的流?
  • 菜鸟问题:请大家用简单的代码描述一下,如何利用接口实现多重继承!
  • fork出来的进程不能完全继承父进程的属性吗?
  • 关于继承的问题。。。。。
  • 急!我使用一个继承了JComponent的类绘图,我想将绘的图绘到Image,有什么办法吗?
  • 子进程为什么没有继承父进程的信号
  • 问一个继承编译的问题,急!!!!!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3