首页 > 试题广场 >

类 CBase 的定义如下: 在构造函数 CDerive 的

[单选题]
CBase 的定义如下: 在构造函数 CDerive 的下列定义中,正确的是()

class CBase {
    int x;
public:
    CBase(int n) : x(n) {}  // 基类构造函数
};

class CDerive : public CBase {
    CBase y;  // 成员对象
    int z;    // 修正笔误
public:
    CDerive(int a, int b, int c);  // 参数列表使用英文逗号
};
  • CDerive::CDerive(int a, int b, int c) : x(a), y(b), z(c) {}
  • CDerive::CDerive(int a, int b, int c) : CBase(a), y(b), z(c) {}
  • CDerive::CDerive(int a, int b, int c) : CBase(a), CDerive(b), z(c) {}
  • CDerive::CDerive(int a, int b, int c) : x(a), CBase(b), z(c) {}
推荐
【正确答案】B
【解析】A 选项由于 x 在 基类 CBase 类中是私有的,所以派生类 CDerive 中无法直接访问。
B 选项正确。
C 选项调用了构造函数 CDerive(b),而 CDerive 类中没有一个参数的构造函数。
D 选项问题同 A 选项。
 
更多C++基础专业知识讲解,点击链接即可查看
https://www.nowcoder.com/link/zxyl-cpp47
编辑于 2021-11-19 10:21:01 回复(0)
我觉得是不是应该是CBase(a), y(b), z(c) ,文中逗号被误打成点
发表于 2017-07-30 12:19:02 回复(0)

创建派生类的对象时,基类对象首先被创建,然后再调用派生类的构造函数,所以CBase(a)放在成员初始化列表的第一位,然后依次初始化新增的数据成员。当然,新增的数据成员的初始化也可以放在派生类的构造函数体内。

发表于 2018-01-09 19:58:01 回复(3)
基类中定义了带有参数的构造函数(编译器不提供默认构造函数),派生类中需要显示调用基类中的构造函数(即不能用默认构造函数)
发表于 2020-09-01 17:31:18 回复(0)

B与D之间,选B的原因是因为,构造时,初始化列表会成员定义和赋值优化到一步里。

子类虽然有继承父类成员,但在初始化列表中,子类进行定义时根据自己的声明,并未发现存在此成员,此成员初始化工作应交给对应归属的父类的初始化列表进行。


详细请见:为什么子类的初始化列表不能初始化父类的成员?

https://www.cnblogs.com/nonsupport/p/8418319.html

发表于 2020-03-07 09:25:49 回复(0)
在类外定义不是要用作用域运算符::么!
发表于 2017-09-04 16:18:45 回复(1)
这道题其实考点在于  x是一个父类变量,子类无法直接进行赋值,即不能直接用x(num),此时需要调用父类中的函数才能对x进行赋值,所以AD错,C中错误在于委托构造函数不能具有其他成员初始值设定项,通俗的说就是子类中本来就有的成员对其赋值时直接采用y(b)形式,而不能用CDerive(b);        也可以这样理解  CDerive只能接受三个参数的构造函数,而CDerive(b)只有一个参数,这是无法运行的。
编辑于 2018-06-30 13:25:25 回复(1)
这题跟构造函数调用顺序半毛钱关系都没有,基类数据成员在基类构造函数里赋值,不能出现在派生类的构造函数参数列表里,所以AD错误;C选项CDerive(b)明显错误
编辑于 2018-04-13 10:07:59 回复(0)
派生类构造函数的调用次序是:
基类构造函数,成员列表构造函数,派生类自己的构造函数
发表于 2018-03-20 19:38:32 回复(0)
涉及到的知识点:
    1. 构造函数的初始化。构造函数初始化可以采用:+ 初始化参数列表的形式实现。
    2. 成员变量没有指明的情况下,默认权限为private。
    3. 子类无法访问父类的私有成员变量。
发表于 2022-09-07 15:58:26 回复(0)
派生类无法访问基类的 private 成员;需要看清楚基类派生类的构造函数
编辑于 2023-09-22 14:36:52 回复(0)