首先,我不知道哪个问题最适合探索它。如果问题不好或相关,您可以更改问题。但请尝试理解我的问题。
这是我们的测验。
测验问题:需要在B类中修改以生成。
num=5
gum=10
原始代码:
#include <iostream>
class A{
private:
int num;
public:
A(int x=0):num(x){
}
A(const A& a):num(a.num){
}
void Display(){
std::cout << "num=" << num << std::endl;
}
void SetNum(int x){
num=x;
}
};
class B: public A{
private:
int gum;
public:
B(int x=0, int y=0):A(x), gum(y){
}
B(const B& b){
gum=b.gum;
}
void Display(){
A::Display();
std::cout << "gum=" << gum;
}
};
int main(){
B b1(5,10);
B b2(b1);
b2.Display();
return 0;
}
我刚把这个代码A::SetNum(5);
放在B的类复制构造函数中。
结果是
num=5
gum=10
但是,当我删除A::SetNum(5);
并运行原始代码时,它会生成。
num=0
gum=10
现在我想问为什么B的复制构造函数没有在原始代码中自动将A(x)字段复制到b2对象?
A的构造函数A(x);
不是Derived类的字段?如果是,则应复制到b2对象。
答案 0 :(得分:0)
现在我想问为什么B的复制构造函数没有在原始代码中自动将A(x)字段复制到b2对象?
因为您明确编写了一个不会在基类中进行任何复制的复制构造函数:
B(const B& b){
gum=b.gum;
}
这里,基类子对象是默认构造的。
最简单的解决方案是删除您的副本构造函数。编译器合成的将做正确的事情。否则,请修复复制构造函数:
B(const B& b): A(b), gum(b.gum) {}