C++ C++;复制构造函数不调用基构造函数

C++ C++;复制构造函数不调用基构造函数,c++,copy,polymorphism,C++,Copy,Polymorphism,为什么默认复制构造函数不调用monster的基本构造函数,但当我在troll中包含一个用户定义的复制构造函数时,它调用父(即:monster)构造函数 我认为它的工作原理如下:创建基本对象,然后复制其中的元素 下面是一个示例代码: using std::cout; struct monster { monster() { cout << "a monster is bread\n"; } ~monster() { cout &

为什么默认复制构造函数不调用
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";
}
使用std::cout;
结构怪物{
怪物(){
库特
为什么默认复制构造函数不调用基构造函数,但当我包含一个用户定义的复制构造函数时,它调用父构造函数

调用的是
怪物
基类的复制构造函数(不是默认构造函数)。原因是在调用
巨魔
的默认生成的复制构造函数之前,会调用其基类(即:
怪物
)的复制构造函数

注意你的代码:

forum_troll ft { };
troll t { ft };
在第二条语句中,很明显,
troll
的默认生成的复制构造函数(因为您没有提供任何用户定义的复制构造函数)将被调用。所调用的是
monster
的复制构造函数(在
troll
的复制构造函数之前),而不是它的默认构造函数,因为这是默认复制构造函数所做的,即:调用基的复制构造函数

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


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

是的,我没有调用基类的复制构造函数。至于澄清:默认的复制构造函数ls基默认复制构造函数,依此类推?默认生成的复制构造函数调用基的复制构造函数(无论该基的复制构造函数是默认生成的还是用户定义的)。这意味着如果我用户定义了一个复制构造函数,我应该显式调用基的复制构造函数,而不是默认构造函数?这样的语句可能太宽泛了。复制构造对象意味着构造对象,因此也意味着构造对象的基类。我建议您考虑复制的语义。例如,在在您的代码中,您通过默认构造函数显示“怪物是面包”,作为
怪物
正在繁殖的标志。但是,不复制
怪物
?嗯,根据您的代码,不复制。也许应该是“怪物被克隆”对于复制构造函数。无论对您的应用程序有什么意义。顺便说一句,我强烈建议您也阅读以下内容: