在以下程序中,如果我在Derived类“D”中更改序列,那么我将获得基类构造函数的不同顺序。
ConcurrentHashMap
在虚拟类概念的情况下,请任何人都可以告诉如何调用构造函数。
答案 0 :(得分:2)
在虚拟类概念的情况下,请任何人都可以告诉如何调用构造函数。
根据initialization order,虚拟基类将首先被初始化。
1)如果构造函数是针对派生程度最高的类的虚拟基础 类按它们出现的顺序初始化 基类深度优先从左到右遍历基类声明 (从左到右指的是基本说明符列表中的外观)
2)然后,直接基类按从左到右的顺序初始化为 它们出现在这个类的基本说明符列表中
3)然后,按照以下顺序初始化非静态数据成员 类定义中的声明。
4)最后,执行构造函数的主体
在所有3个案例中,班级D
继承自A
,B
和C
,其中包含{{1}中的两个虚拟基类} {} D
通过A
和B
继承,C
通过B
继承。 C
首先会被初始化,因为它是最基类的,因此对于所有3个案例,A
和A()
将首先打印出来。
之后,直接基类将按从左到右的顺序进行初始化。对于第一种情况,他们将B()
A()
B()
,对于第二种情况,他们将C()
B()
{{1} },对于第三种情况,他们将C()
A()
B()
。
答案 1 :(得分:0)
虚拟基础始终在DFS后期订单中首先初始化。这保证了虚拟A和B基础将首先被初始化,而A在B之前被初始化,因为B是从A得到的。之后,三个非虚拟基数A,B,C按照您的预期简单地按声明顺序初始化。