在多级继承的情况下无法理解虚拟基类构造函数
Not able to understand virtual base class constructor in case of multilevel inheritance
在下面的程序中,如果我更改派生类"D"中的序列,那么我将获得基类构造函数的不同顺序。
#include <iostream>
using namespace std;
class A {
public :
A ()
{
cout << "A()" <<endl;
}
};
class B : virtual A{
public :
B ()
{
cout << "B()" << endl;
}
};
class C : virtual B{
public :
C ()
{
cout << "C()" << endl;
}
};
Case (1)
========
class D : public A, public B, public C
{
};
int main()
{
D d;
return 0;
}
OUTPUT :
A()
B()
A()
B()
C()
Case (2)
========
class D : public C, public B, public A
{
};
int main()
{
D d;
return 0;
}
OUTPUT :
A()
B()
C()
B()
A()
Case (3)
========
class D : public B, public A, public C
{
};
int main()
{
D d;
return 0;
}
OUTPUT :
A()
B()
B()
A()
C()
请谁能说出在虚拟类概念的情况下如何调用构造函数。
请谁能说出在虚拟类概念的情况下如何调用构造函数。
根据初始化顺序,首先初始化虚拟基类。
1( 如果构造函数用于派生最多的类,则虚拟基 类按它们出现的顺序进行初始化 基类声明的深度优先从左到右遍历 (从左到右是指基本说明符列表中的外观(
2(然后,直接基类按从左到右的顺序初始化为 它们出现在此类的基本说明符列表中
3(然后,非静态数据成员按以下顺序初始化: 类定义中的声明。
4(最后,执行构造函数的主体
在所有 3 种情况下,类 D
继承自 A
、B
和 C
,D
中有两个虚基类,即 A
通过B
和C
继承,B
通过C
继承。A
将首先初始化,因为它是最基的类,因此对于所有 3 种情况,首先将打印出A()
和B()
。
之后,直接基类将按从左到右的顺序初始化。对于第一种情况,它们将被A()
B()
C()
,对于第2种情况,它们将被B()
C()
A()
,对于第三种情况,它们将被B()
A()
C()
。
虚拟基总是在 DFS 后序中首先初始化。这保证了虚拟 A 和 B 碱基将首先初始化,A 在 B 之前初始化,因为 B 是从 A 派生的。之后,三个非虚拟碱基 A、B、C 按照您的预期简单地按声明顺序初始化。
相关文章:
- 子类地址等于虚拟基类地址?
- 虚拟基类函数中派生类的大小
- 虚拟基类初始化
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 返回纯虚拟基类的向量的元素
- std::is_base_of和虚拟基类
- 如何在子类中重写时调用私有虚拟基类实现
- 从两个不同类继承的非虚拟基类的访问成员
- 为什么必须由最派生的类构建虚拟基类
- 虚拟基类的派生类列表
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 虚拟基类和继承
- (为什么)纯虚拟派生类中是否需要虚拟基类构造函数调用?
- 在派生类中使用虚拟基类的受保护的CTOR
- 私有非虚拟基类函数被称为派生类中的函数
- 虚拟基类的创建顺序
- 使用虚拟基类C++向下转换
- 为什么在派生最多的类的初始值设定项列表中显式调用虚拟基类构造函数的规则,而较老的祖先已经拥有它?
- 虚拟与纯虚拟基类函数并从DLL导出
- 在多级继承中派生的虚拟基类会发生什么