是啊,我是说明为什么会调用失败的原因,因为子类要在初始化列表中构造他所有的直接基类以及非直接虚基类。
而Usable_lock()这个非直接虚拟基类的构造函数是无参构造函数,可以省略,所以在class DD中就没有显示写出,但是其实是存在的,也即是说DD类的构造函数是这样的:
DD:Usable_lock(),Usable(){}
之前已经明白了......
Viva,espana!
之前已经明白了......
class base //基类
class derive1 : public base
class derive2 : public base
class derive3 : public derive1,public derive2
===================================================
class base //基类
class derive1 : virtual public base
class derive2 : virtual public bass
class derive3 : public derive1,public derive2
=====================================================
我认为在非虚继承的时候 在构造derive3时,其父类调用顺序为derive1-base-derive2-base
构造函数顺序是 base-derive1-base-derive2
在虚继承的时候,在构造derive3时,其父类调用顺序为derive1-base-derive2
构造函数顺序是 base-derive1-derive2
并非你说的那样
楼上的真是细心,是我没叙述清楚,我这里说的是一个父类访问顺序,并非构造函数执行的顺序。
比如非虚继承,还是那个例子,
在创建derived3时,顺序(访问顺序)是derived1-base-derived1-derived2-base-derived2;
红色部分为构造函数执行顺序。
而虚继承中:
在创建derived3时,顺序(访问顺序)是base-derived1-derived2.
同样红色部分为构造函数执行顺序。
这样就可以根据访问顺序,看到是谁在访问父类,所以解决最初那个问题。
由于那时写的匆忙,没有说明清楚。见谅了!谢谢指出。
你的两个问题确实就是一个问题,你不明白,DD类是怎么和Usable_lock类是怎样作用的。
首先,在非虚继承时,能通过编译。这时,在创建DD对象时,要创建其直接基类子对象,所以由DD类访问到Usable类,要创建usable类对象,要创建其直接基类Usavle_lock类的子对象,所以由Usable访问Usable_lock类,所以可以成功。
而在虚继承中,DD类会首先访问Usable_lock类,所以不成功。
#include <iostream>
using namespace std;
struct base{
base(){cout << "construct base\n";}
};
struct derived1 : /*virtual*/ base{
derived1(){cout << "construct derived1\n";}
};
struct derived2 : /*virtual*/ base{
derived2(){cout << "construct derived2\n";}
};
struct derived3 : derived1,derived2{
derived3(){cout << "construct derived3\n";}
};
int main(){
derived3 obj;
}