#include <iostream>
using namespace std;
struct A{
A(){}
A(const A&) {cout<<"1";}
};
struct B: A{
B(){}
B(const B&){}
};
struct C: A{
C(){}
C(const B&rhs):A(rhs){}
};
struct D:A{
D(){}
};
int main(){
D d;
D dcopy(d);
C c;
C ccopy(c);
B b;
B bcopy(b);
}
当我运行这个程序时,我预期输出为:111,但输出为:11,请解释!!!
C(const B& rhs) : A(rhs) {} // presence of this line has no influence on output,
// please explain, why?
答案 0 :(得分:2)
B(const B&){}
此代码不输出任何内容,也不复制构造A
(默认构造它)。所以B bcopy(b)
不会输出任何内容。也许你的意思是:
B(const B& rhs) : A(rhs) {}
答案 1 :(得分:0)
根据C ++标准
8在非委托构造函数中,如果是给定的非静态数据成员 或者基类不是由mem-initializer-id指定的(包括 因为构造函数没有mem-initializer-list的情况 没有ctor-initializer)并且实体不是虚拟基类 一个抽象类(10.4),然后......
- 否则,实体默认初始化(8.5)。
和
15非联合类的隐式定义的复制/移动构造函数 X执行其基础和成员的成员复制/移动。
因此,在您的示例中,类D隐式定义了复制构造函数,并根据第二个引用执行其基类的复制,即它调用A的复制构造函数。
同样适用于C类(C没有明确的用户定义的复制构造函数,因此编译器定义了一个隐式复制构造函数。这个定义C(const B&amp; rhs):A(rhs){}不是定义复制构造函数。它是一个带有一个参数的构造函数。)
B类没有隐式定义的复制构造函数。它有一个用户定义的复制构造函数。因此,根据第一个引用,它执行其子对象的默认初始化,它调用类A的默认构造函数。