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

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

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

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

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



分享到:
评论

相关推荐

    虚基类的使用实例

    ### 虚基类的使用实例详解 #### 一、虚基类概念解析 在C++中,虚基类主要用于解决多继承中的钻石问题(即多个派生类继承自同一个基类,而...通过上述分析,我们可以更深入地理解虚基类的概念及其在C++编程中的应用。

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

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

    在派生类的构造函数中调用基类的构造函数

    在C++中,有两种方式在派生类构造函数中调用基类构造函数: 1. 显式使用`base_class::constructor`语法: 派生类构造函数的初始化列表中可以直接指定基类的构造函数,如: ```cpp class Derived : public Base {...

    多继承和虚基类PPT

    在多继承情况下,基类构造函数的执行顺序按它们在被继承时所声明的顺序(从左到右)依次调用,与它们在初始化列表中的顺序无关。多继承构造函数调用顺序可以用一个示意图来表示。 多继承机制下的命名冲突 多继承...

    基类子类虚函数的调用顺序问题

    在描述的问题中,如果在基类构造函数中调用了一个虚函数,那么不论对象实际是基类还是子类,都会调用基类版本的这个函数。这是因为在构造函数执行期间,子类的部分还没有被初始化,因此虚函数表(vtable)尚未包含...

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

    在C++编程中,对象的构造过程涉及到多个层面,包括对象成员构造函数、基类构造函数以及派生类本身的构造函数。理解它们的执行顺序对于编写健壮的代码至关重要。以下将详细阐述这三个构造函数的调用时机和逻辑。 1. ...

    虚基类与虚函数PPT学习教案.pptx

    虚基类和虚函数是C++面向对象编程中的重要概念,它们主要解决多继承中可能出现的问题,特别是关于共享基类实例和二义性问题。在本篇PPT学习教案中,我们将深入探讨这两个主题。 首先,让我们理解虚基类的概念。在多...

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

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

    详解C++中基类与派生类的转换以及虚基类

    虚基类的特性使得派生类在内存布局上有所不同,同时也影响了构造函数和析构函数的调用顺序。 总的来说,理解和熟练掌握基类与派生类之间的转换,以及如何使用虚基类,对于编写高效且健壮的C++代码至关重要。这些...

    C++与操作系统等面试题51

    这些基类的构造顺序遵循它们在继承列表中的声明顺序。 3. **成员变量的初始化**:在构造函数体之前,根据成员初始化列表中的顺序初始化所有成员变量。成员变量的初始化必须在构造函数体执行之前完成,并且在`vptr`...

    C++派生类的构造函数

    这可以通过在派生类构造函数的初始化列表中指定基类构造函数来实现。例如: ```cpp class Derived : public Base { public: Derived(int val) : Base(val) { /*...*/ } }; ``` 在这个例子中,`Derived`是`Base`的...

    C++面向对象程序设计习题继承与派生.pdf

    "C++面向对象程序设计习题继承与派生.pdf" 继承是面向对象程序设计中的一种重要机制,它...在C++中,虚基类成员的初始化顺序是在派生类构造函数的成员初始化列表中出现的虚基类构造函数先于非虚基类构造函数的调用。

    VisualC++面向对象程序设计教程与实验(第二版)清华大学出版社第5章习题参考答案.pdf

    创建含有虚基类的对象时,虚基类的构造函数会在其他非虚基类之前被调用,遵循上述的构造顺序规则。 8. **虚基类的构造函数调用**: 如果基类中包含虚基类,构造函数调用顺序遵循以下规则: - 先调用虚基类的构造...

    深入解析C++编程中基类与基类的继承的相关知识

    在深入解析C++基类与继承的过程中,我们需要理解以下几个关键概念: 1. **单一继承与多重继承**: - **单一继承**:一个派生类从一个基类继承。在这种情况下,派生类只有一个直接基类,但可以间接继承更多的基类。...

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

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

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

    - 构造顺序:基类构造函数先于派生类构造函数执行,内嵌对象的构造函数按照它们在类中声明的顺序执行。 - 解决二义性问题:通过将共同基类声明为虚基类,如`class 派生类名: virtual 继承方式 基类名`,确保所有...

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

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

    计算机二级C++模拟题及答案.docx

    - 若虚基类是从非虚基类派生而来,先调用基类构造函数,然后调用派生类构造函数 3. C++中不能重载的运算符: - 运算符`::`(作用域解析运算符)不能被重载,但其他如`*`、`>=`和`/`等可以 4. 构造函数与对象初始...

Global site tag (gtag.js) - Google Analytics