C++为了保证虚基类构造函数只被建立对象的类执行一次
C++为了保证虚基类构造函数只被建立对象的类执行一次,规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化。参数表中的其他调用被忽略,即直接基...
C++为了保证虚基类构造函数只被建立对象的类执行一次,规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化。参数表中的其他调用被忽略,即直接基类的构造函数只调用系统自带的版本,或调用自定义版本但不对虚基类数据成员初始化。
这句话中“直接基类的构造函数只调用系统自带的版本,或调用自定义版本但不对虚基类数据成员初始化。”
这句话怎么理解? 展开
这句话中“直接基类的构造函数只调用系统自带的版本,或调用自定义版本但不对虚基类数据成员初始化。”
这句话怎么理解? 展开
2012-07-02
展开全部
你应该知道虚基类是为了防止多继承产生问题,比如一个基类可能会被同一个子类继承好几次,有了虚基类,那么这个基类就不会在对象内存布局上重复出现了。然后再看这句话,结合前面的描述,我们可以这样理解。
class A //基类A
class B:public A //B继承A
class C:public A,B //C继承A,也继承B,此处A应该为虚继承,否则A就会被继承两次,因为B继承A
当创建 C对象 c时:
C c
在虚继承的情况下,为了保证虚基类A只被构造一次,那么我们就这样规定了:
1.在c创建时中会调用A的构造函数初始化和C本身的构造函数初始化。(对应这句话:“
规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化”)
2.B属于c的直接基类,在构造c是当然要构造B,也就是会调用系统提供给B的构造函数或者B自定义的构造函数,但是B不会在这里不会对A初始化了。(这就是你问的地方)
上面只是分成两个部分说明,并不代表构造的准确过程
class A //基类A
class B:public A //B继承A
class C:public A,B //C继承A,也继承B,此处A应该为虚继承,否则A就会被继承两次,因为B继承A
当创建 C对象 c时:
C c
在虚继承的情况下,为了保证虚基类A只被构造一次,那么我们就这样规定了:
1.在c创建时中会调用A的构造函数初始化和C本身的构造函数初始化。(对应这句话:“
规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化”)
2.B属于c的直接基类,在构造c是当然要构造B,也就是会调用系统提供给B的构造函数或者B自定义的构造函数,但是B不会在这里不会对A初始化了。(这就是你问的地方)
上面只是分成两个部分说明,并不代表构造的准确过程
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询