问题:
C++中虚继承,Grandma <- Father <- Son, Father 虚继承自 Grandma,但是构造Son对象的时候为什么只能掉到Grandma的默认构造函数,真是费解,虚继承主要是用于解决多重继承产生ambigrous 问题,这个问题由虚继承引起,不涉及多重继承的层面问题......
[已经解决]
原因: 在C++编译器中建立对象时,如果这个对象中包含从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的 ,而且只有最远派生类的构造函数会调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用都自动被忽略 。
<<C++ Primer>> 第四版 第626页也有相应的描述需要显示初始化基类。看过的,很长时间了,没想起来。
回头想想,这么做的目的也是为了避免多继承时候,
如:
Grandma <-(virtual) Father <- Son
<-(virtual) Uncle <-
Father和Uncle均对Grandma有不同的默认值的设置的话,创建Son对象的话,会对Grandma的成员变量的赋值残生二义性 。 所以为了避免这种情况的发生,就直接在Son对象中进行Grandma成员变量的初始化工作。
示例程序:
输出:输出为0,证明调用的Grandma的默认构造函数。Why只能掉到默认的?
Grandma Called!
0
0
Father Called!
Son Called!
0
0
以下按照3楼意见更行的代码,可以看出端详
输出:
Grandma Called!
1
2
Father Called!
1
2
3
Son Called!
1
2
3
Grandma Called!
1
2
Father Called!
1
2
3