多继承和虚基类

摘要:
2.如果虚拟基类和非虚拟基类都包含在同一继承层次结构中,则C++编译器首先调用虚拟基类的构造函数,然后调用非虚拟基类的构造器。
一.多继承机制存在哪些问题,怎么解决这些问题?
——歧义性:相同名称的成员在内存中同时拥有多个拷贝,当通过派生类对象使用这些成员时,就会产生歧义性。作用域操作符虽然能解决歧义性问题,但并没有解决多个拷贝的问题。

 多继承和虚基类第1张

类D 的内存布局

多继承和虚基类第2张

使用虚拟机制注意事项:
1.若在虚基类中定义了带参数的构造函数,而没有定义默认构造函数,则必须在所有的直接或间接派生类中使用成员初始化列表调用虚基类的构造函数。
注意:
  • 如果没有虚拟继承,则只需要在直接派生类中使用成员初始化列表调用虚基类的构造函数。
  • 在上例中,如果B,C,D都调用了A的构造函数,那么有效构造函数为调用该构造函数的类所定义的构造函数,每个继承的类都显示调用基类构造函数可以解决各个派生类定义的构造函数不一致的情况。
多继承和虚基类第3张
2.如果在同一继承层次中同时包含虚基类和非虚基类,C++编译器先调用虚基类的构造函数,再调用非虚基类的构造函数。
 
3.如果虚基类是由非虚基类派生而来,同样遵循先调用基类构造函数,再调用派生类构造函数。
 
(实际应用中并不建议使用多重继承,一则因为编译器问题,二则多重继承会带来二义性问题。单继承对描述事物已经提供了足够强大的功能。并非要使用多继承不可)
 
二.多继承构造函数和析构函数的执行顺序
多继承和虚基类第4张
析构函数的调用顺序与构造函数相反
例如:
多继承和虚基类第5张
 
基类指针与派生类指针的指向关系
基类指针或引用可以在不进行显示类型转换的情况下指向派生类对象,但基类指针或引用只能用于调用基类方方法。派生类指针不可以指向基类对象。

免责声明:文章转载自《多继承和虚基类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jquery滚动条加载数据疑似Windows server自动更新引发的sqlserver宕机下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS的继承

对于继承的实际运用还没有很好的理解,这里就先说说JS中继承的实现。 类式继承 作为基于原型的语言,JS也可以模仿类式继承。首先声明一个父类 function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function...

java 类变量初始化顺序

假定有一个类定义如下: package com.zhang; public final class Girl { // static代码块1 private static String sex = "female"; // 成员方法代码块1 private String name = "anonymous";...

如何分析和提高(C/C++)程序的编译速度?

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.cnblogs.com/lihuidashen/p/12937085.html 微信链接:https://mp.weixin.qq.com/s/MFOaa-Dw1iNMXuXPfXjLBA 一个别人的vs 2010 的程序...

ES6-10笔记(class类)

class类 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。摘自阮一峰老师语录 class声明 ES5的JavaScript中只有对象,想要模拟类去生成一个对象实例,只能通过定义一个构造函数,然后通过new操作符来完...

JAVA注释规范

在软件开发的过程中总是强调注释的规范,但是没有一个具体的标准进行说明,通常都是在代码编写规范中简单的描述几句,不能作为一个代码注释检查的标准和依据,做什么都要有一个依据吗:),现在我特整理了一个《Java的注释规范》,内容来自网络、书籍和自己的实际积累。 JAVA注释规范 版本/状态 作者 版本日期 1.0 ghc 2008-07-02 一、背景 1、当我...

python 多重继承构造函数调用顺序

实例代码 class Person(object): def __init__(self, name, age): self.name = name self.age = age print("父类构造函数") def talk(self): print("person...