问题在于。C++对继承类的处理机制。
D 有1个B ,一个C, 2个A的test。不过一系列 *** 作之后(构造函键缓改数里的步骤),A已经归属到D的名下,B与A再无关联。
B::A就不无法通过了。
而因为有两个A在D中,由于是B,C调用的默认构造,D中两个A的对象并没有名称,无法区分。
有点类似于局部静态变量,虽然他在内存中存在,但是你就是取不到值。
这是在语法上,事实上,你可以从地址方面取值(这可稿判以实现,不过不是从C++面向对象的思路来搞的了。)
选B的原因如下:问题1:对象成员的问题
子类Derived中有2个成员b和j,而b是基类Base类型的对象,我们选来分析这个对象成员b
在C++中,我们要使用非默认的构造函数来初始化对象成员(注意:不一定是基类的对象成员,这里介绍的情况适合所有对象成员)则必须使用初始化列表才能实现,比如
class B{public: B(int i){} }
class A{public: B mb}
在上面语句中看起桐仔来没有问题,但是当我们创建类A的对象时,比如A ma就会出错,就会出现类A的对象成员mb没有可用的默认构造函数的错误,原因就是在类A中的对象成员mb是使用的默认构造函数来初始化的,因此要使程序正确,必须把类桥铅A改为如下语句
class A{public B mbA():mb(3){} }
使用初始化列表,调用类B的带有一个参数的构造函数初始化对象成员mb,当数整数3可以替换为任何类型相容的整数变量
问题2:继承的问题
在派生类中调用基类带参数的构造函数的方法:在派生类的构造函数中使用初始化列表的形式就可以调用基类带参数的构造函数初始化基类成员,如B():A(int i){},类B是类A的派生类。
原因如下:
如果派生类没有显示用初始化列表调用基类的构造函数时,这时就会用派生类的构造函数调用基类的默认构造函数,构造完基类后,才会执敏轮好行派生类的构造函数函数体,以保证先执行基类构造函数再执行派生类构造函数的顺序,如果基类没有默认构造函数就会出错。
问题3:类中的普通成员
对于子类Derived中的整型变量成员j,这个不用解释了吧,很简单。
综上所述,所以能满足以上要求的答案只有B
Derived : : Derived (int t) : b(t), Base(t), j(t) { }
第一句b(t)表示使用类Base中还有一个参数的构造函数初始化子类Derived中的对象成员b(注意:这个对象成员不一定非要是基类对象成员),
第二句Base(t)表示调用基类中的带有一个参数的构造函数构造基类部分
第三句j(t)这个不解释,很简单,楼主应该懂。
所以答案A是错误的,因类基类Base没有默认构造函数,在子类中必须显示调用基类的非默认构造函数构造基类部分
答案C是错误的:因为子类中的对象成员b是没有默认的构造函数的,在C中没有明确使用初始化列表调用对象成员的非默认构造函数初始化对象成员b
称案D就错得更明显了:除了有答案A的错误之外,还要加上变量i并不是子类的成员变量的错误,因此变量i轮不到使用子类来初始化。
如果你还不是很理解的话,可以去本人的文库下载专题文现<C++类中的各种成员,嵌套类,友元,this指针专题>和<C++继承,虚函数与多态性专题>,里面有专门介绍,相信其他内容也会给你一些帮助
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)