继承将基类构造函数复制到派生类Object

时间:2015-08-30 08:52:43

标签: c++ copy-constructor

首先,我不知道哪个问题最适合探索它。如果问题不好或相关,您可以更改问题。但请尝试理解我的问题。

这是我们的测验。

测验问题:需要在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对象。

1 个答案:

答案 0 :(得分:0)

  

现在我想问为什么B的复制构造函数没有在原始代码中自动将A(x)字段复制到b2对象?

因为您明确编写了一个不会在基类中进行任何复制的复制构造函数:

B(const B& b){
    gum=b.gum;
}

这里,基类子对象是默认构造的。

最简单的解决方案是删除您的副本构造函数。编译器合成的将做正确的事情。否则,请修复复制构造函数:

B(const B& b): A(b), gum(b.gum) {}