C ++ Copy Construcor不会调用Base Constructor

时间:2018-01-26 17:18:50

标签: c++ copy polymorphism

为什么默认的复制构造函数不会调用monster的基础构造函数,但是当我在troll中包含一个用户定义的复制构造函数时,它会调用父元素(即:monster)构造

我认为它的工作原理如下:创建基础对象,然后复制里面的元素。

以下是示例代码:

using std::cout;

struct monster {
    monster() {
        cout << "a monster is bread\n";
    }
    ~monster() {
        cout << "monster killed\n";
    }
    void health() {
        cout << "immortal?\n";
    }
    virtual void attack() {
        cout << "roar\n";
    }
};

struct troll: monster {
    troll() {
        cout << "a troll grows\n";
    }
    ~troll() {
        cout << "troll petrified\n";
    }
protected:
    int myhealth { 10 };
};

struct forum_troll: troll {
    forum_troll() :
            troll { } {
        cout << "not quite a monster\n";
    }
    ~forum_troll() {
        cout << "troll banned\n";
    }
};

int main() {
    cout << "a ------\n";
    forum_troll ft { };
    cout << "copy \n \n";
    troll t { ft };
    cout << "end \n \n";
}

1 个答案:

答案 0 :(得分:1)

  

为什么默认的复制构造函数不会调用Base Constructor,但是当我包含一个用户定义的复制构造函数时,它会调用父构造函数?

所谓的是monster基类的复制构造函数(不是默认构造函数)。原因是在调用troll默认生成的复制构造函数之前,其基类的复制构造函数(即:monster被称为。

注意你的代码:

forum_troll ft { };
troll t { ft };

在第二个语句中,很明显将调用troll的默认生成的复制构造函数(因为您没有提供任何用户定义的复制构造函数)。它是monster的复制构造函数(在troll的复制构造函数之前),而不是它的默认构造函数,因为这是默认复制构造函数的作用,即:调用base的副本构造

这种默认行为是有道理的,因为troll的基类是monstertroll对象是monster对象)。因此,在复制构建troll之前,必须复制monster

当您为troll提供用户定义的复制构造函数时,您可能没有显式调用monster的复制构造函数,因此monster默认构造函数被调用。