首页 > 试题广场 >

有以下类定义 using namespace std; cl

[单选题]
有以下类定义
using namespace std;
class B1{
    int b1;
public:
    B1(int i){
        b1=i; cout<<b1; }
    ~B1( ){ cout<<"#1"; }
};
class B2 {
    int b2;
public:
    B2( ){b2=0; cout<<"*2"; }
    ~B2( ){ cout<<"#2"; }
};
class C: virtual public B1,public B2 {
    int j;
public:
    C(int a,int b,int c):B1(a),_______ ,j(c){cout<<"*3";}
    ~C( ){ cout<<"#3"; }
private:
    B1 c1;
    B2 c2;
};
请为横线处选择合适的程序将派生类C的构造函数补充完整。
  • B1(b)
  • c1(b)
  • c2(b)
  • B2(b)
答案是B,简单解释一下为什么不选另外三个:
A选项中的B1(b):基类B1已经在B1(a)中显式初始化过了,不能再次初始化
C选项中的c2(b):成员变量c2是类B2的对象,而类B2并没有参数列表相匹配的构造函数
D选项中的B2(b):基类B2没有参数列表相匹配的构造函数
发表于 2019-08-17 16:50:26 回复(6)
B2不需要实参,而B1的对象从c1需要初始化
发表于 2019-10-24 16:38:29 回复(3)
封闭类用实例名(c1)初始化;
派生类对基类用类型名(B1)初始化
发表于 2021-03-20 21:34:47 回复(0)
#include<iostream>
using namespace std;
class B1{
    int b1;
public:
    B1(int i){
        b1=i; cout<<b1; }
    ~B1( ){ cout<<"#1"; }
};
class B2 {
    int b2;
public:
    B2( ){b2=0; cout<<"*2"; }
    ~B2( ){ cout<<"#2"; }
};
class C: virtual public B1,public B2 {
    int j;
public:
    C(int a,int b,int c):B1(a),c1(b),j(c){cout<<"*3";}
    ~C( ){ cout<<"#3"; }
private:
    B1 c1;
    B2 c2;
};
int main()
{
    C c(1,2,3);
    return 0;
}


//输出:1*22*2*3#3#2#1#2#1
我想问一下各位同学,上述程序的输出结果为什么是这样的,构造和析构的顺序是怎样的
发表于 2022-03-30 22:39:28 回复(1)
C,D都没有对应的构造函数
发表于 2023-10-19 14:58:33 回复(0)
继承会调用基类构造函数
发表于 2021-11-27 16:56:27 回复(0)
没看懂 没理解
发表于 2021-02-25 19:04:34 回复(1)
❓疑问,为什么D不对,参数不对应?编译器不是提供一个默认的复制构造函数吗,为什么会不对应呢?
发表于 2020-10-08 00:45:38 回复(1)
这题我觉得有问题呀,B1 B2是类,而不是对象,为什么还要初始化?
发表于 2020-07-24 17:03:47 回复(1)