`
YuHuang.Neil
  • 浏览: 180730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的虚基类及其构造顺序

 
阅读更多
虚基类是为了消除歧义和保持基类成员一个拷贝而产生的概念。当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或者说是多个副本),如果想要保持这个基类的一个实例,可以将这个公共基类说明为虚基类。

在继承中产生歧义的原因可能是继承类继承了基类多次,从而产生了多个拷贝,即不止一个通过多个路径继承基类,导致在内存中创建了基类成员的多个拷贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过吧基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。使用virtual限定符吧基类继承说明为虚拟的。

虚基类的初始化:
虚基类的初始化与一般继承的初始化在语法上没有任何区别,但是构造函数的调用次序有所不同。派生类构造函数的调用次序必须满足一下三个原则:
(1) 虚基类的构造函数在非虚基类之前被调用;
(2) 如果同一层次包含多个虚基类,这些虚基类的构造函数按它们说明次序调用;
(3) 若虚基类由非虚基类派生而来,则依然优先调用基类构造函数,再调用派生类的构造函数。



分享到:
评论

相关推荐

    C++ 虚继承对基类构造函数调用顺序的影响

    可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;  ...

    多重继承--虚基类工程代码

    且构造函数和析构函数的调用顺序和单继承是一样的,先调用基类构造函数,再调用对象成员的构造函数,最后调用派生类的构造函数。那么处于同一层次的各个基类构造函数的调用顺序是取决于声明派生类时所指定的各个基类...

    C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar

    C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar

    c.c++找工作面试重点结构图-mindmanager

    (7) 在一个成员初始化列表中同时出现对虚基类和非虚基类构造函数的调用时,虚基类的构造函数先于非虚基类的构造函数执行。 在虚继承体系中的通过virtual继承而来的基类 继承子类与父类关系 具体化 类的层次通常...

    类的继承第二次作业(多重继承与虚基类)参考答案_C++_teacher_

    定义一个Person 类,结构如下图,为该类添加输入输出流运算符重载。Person 类以Public方式派生出一...char* title(职称),为该类添加输入输出流运算符重载,完成有参、无参、拷贝构造函数的定义,在主函数测试Teacher类

    c++ 习题 派生类和继承

    含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化?继承与组合之间的区别与联系是什么?派生类的构造函数是怎样的...

    C++构造函数初始化顺序

    C++构造函数按下列顺序被调用:  (1)任何虚拟基类的构造函数按照它们被继承的顺序构造;  (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;  (3)任何成员对象的构造函数按照它们声明的顺序调用;  (4...

    类的继承与派生实验

    1:掌握单继承和多继承下派生类的定义方法,理解基类成员在...3:理解同名冲突的产生原因,会使用虚基类来解决第三类同名冲突问题,并理解引入虚基类后构造函数、析构函数的调用顺序。 4:理解赋值兼容的相关使用方法。

    C++上机实验报告-实验五.docx

    基类构造函数的调用顺序是按照派生类定义时的顺序,而内嵌对象的构造函数调用顺序是按照成员在类C++上机实验报告-实验五全文共7页,当前为第2页。C++上机实验报告-实验五全文共7页,当前为第2页。中声明的顺序。 C++...

    C++经典语法与应用

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

    C++构造函数和析构函数顺序

    基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序。  2.成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的...

    C++经典语法掌握C++

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

    C++经典语法与应用实例源码

     析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换的内幕,虚拟函数与多态性,  引用和指针的变量的区别与共同处。VC工程的编译原理与过程,将工程中不同的类拆分...

    C++构造函数和析构函数的调用顺序1

    C++构造函数和析构函数的调用顺序举例一.调用方法和区别1、构造函数的调用顺序: 基类构造函数、对象成员构造函数、派生类本身的构造函数 2、析构函数的调用顺序:

    掌握C++的具体语法

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

    C++经典语法与应用,类的编写与应用

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

Global site tag (gtag.js) - Google Analytics