阿胶菜谱网

当前位置:主页 > 养生禁忌 > 正文

C++多继承的二义性问题—养生网中医养生养生保健食疗养生养生之道最好的养生网站提供生活小常识100个养生小窍门

2021-10-13 | 来源:未知

  在多重继承中,需要解决的问题是标识符不唯一,即二义性问题。比如,当在派生类继承的多个基类中有同名成员时,派生类中就会出现标识符不唯一的情况。

  在多重继承中,派生类由多个基类派生时,基类之间用逗号隔开,且每个基类都指明继承方式,否则默认是私有继承。以通过3种方法解决二义性问题。

  如果派生类的基类之间没有继承关系,同时又没有共同的基类,则在引用同名成员时,可以在成员名前面加上类名和域运算符来区别来自不同基类的成员。

  在派生类中重新定义与基类中同名的成员(如果是成员函,则参表也要同,否则是重载)以屏蔽掉基类中的同名成员,在引用这些同名成员时,引就是派生类中的成员。

  在多重继承中,要引用派生类的成员时,是在派生类自身的作用域寻找,如果找不到再到基类中寻找。这时,如果这些基类有共同的基类,派生类访问这个共同基类的成员时,就有可能由于同名成员的问题而发生二义性,时就需要虚基类来解决。

  上边的代码表面上看类Base治癫比较好的医院是哪家1和类Base2是同一个基类Base派生出来的,是其对应的却是基类Base的两个不同的复制。因此,当派生类Derived要访问变量x时不知哪条路径去寻找,从而引发二义性问题。

  上述代码对应的类层次结构如图1所示,属于非虚基类的类层次结构。要解决该问题,需要引入虚基类,其具体的做法是将公共基类声明为虚基类,这样这个公共基类就只有一个拷贝,从而不会出现二义性问题。虚基类的类层次结构如图2所示。

  这种派生方式做虚拟继承,虚基类关键字的作用范围和派生方式与一般派生类的声明一样,只对紧跟其后的基类起作用。声明了虚基类以后,虚基类的成员在进一步的派生过程中和派生类一起维护同一个内存拷贝。

  在上述代码中,由于把公共基类Base声明为类Base1和Base2的虚基类,所以由类Base1和类Base2派生的类Derived只有一个基类Base,消除了二义性。

  虚基类的初始化与一般的多继承的初始化在语法上是一样癫痫发作的前兆是什么的,但是构造函数的执行顺序不同。主要在以下方面:

  若同一层次中含多个虚基类,这些虚基类的构造函数按照他们被声明的先后顺序执行;

  若虚基类由非虚基类派生而来,则仍然先执行基类的构造函数,再执行派生类的构造函数。

  上边的代码中,虚基类Base的构造函数只执行了一次,这是因为当派生类Derived调用了虚基类Base的构造函数之后,类Base1和Base2对虚基类Base构造函数的调用就被忽略,这是初始化虚基类和初始化非虚基类的不同。

  虚基类的关键字virtual与派生方式的关键字public,private,protected的书写位置无关紧要,可以先写虚基类的关键字,也可以先写派生 方式的关键字;

  虚基类构造函数的参数必须由最新派生出来的类负责初始化,即直接继承如此。

  文章出处:【微信号:gh_bee81f890fc1,微信公众号:面包板社区】欢迎添加关注!文章转载请注明出处。

上海哪家癫痫病医院比较好?

  对于某些特定类类型的全体对象而言,访问一个全局对象有时是有必要的。在程序运行的任意点可能需要统计已创....

  在本文中,将用于 AI 开发的高库,并谈谈它们的优缺点,以及特性。

  全局变量只能通过地址间接调用,为了访问C++语言中全局变量,首先要通过extern伪指令引入全局变量....

  C++是一种高深莫测的语言,这是众所周知的。它的复杂度,我们可想而知。下面让我们一同与作者,走进C+....

  在实际工程中,利用好这一工具仍值得考究。本文将介绍Vivado HLS时的几个误区。

  因此在多线程环境中对一个变量进行读写时,我们需要有一种方法能够保证对一个值的递增操作是原子操作——即....

  容器是面向对象语言的诞生而提出的,容器类在面向对象语言中特别重要,甚至它被认为是早期面向对象语言....

  多态性是指发出同样的消息被不同类型的对象接收时有可能完全不同的行癫痫频繁的发作会带来哪些危害为。

  所谓 内省 是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果该语具有运行期间检查对象型....

  C++是在C语言的基础上发展来的,但是并不是C++比C语言高级,两者的编程思想不一样,应用的领域也不....

  指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质....

  Google C Style Guide是一份不错的C编码指南,我制作了一张比较全面的说明图,可以在....

  BSDL边界扫描语言的边界扫描是一个完善的测试技术。 边界扫描在自当联合测试行动组(JTAG)90年....

  今天所讨论的内容就是通过QT开发的GUI软件来控制ZedBoard板上的硬件外设,完整的信号链如下:....

  Vivado hls既支持结构体,也支持枚举类型,这两种类型都可以作为接口出顶层函数。如果结构体....

返回首页>>

推荐阅读

推荐阅读