选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 mb; A():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轮不到使用子类来初始化。
如果你还不是很理解的话,可以去本人的文库下载专题文现
这几个选项我没有看出错误
但出题者的本意似乎是让你初始化Derived的所有数据成员,这就要搞清楚Derived有哪些数据成员:b,j以及从Base类继承来的i,所以选择把这三个变量全都初始化的选项,一般初始化基类(本例中为Base类)的成员是调用他的构造函数,所以选B