gpt4 book ai didi

C++ Copy Constructor 不调用 Base Constructor

转载 作者:行者123 更新时间:2023-11-30 05:05:18 28 4
gpt4 key购买 nike

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

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

这是一个示例代码:

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";
}

最佳答案

Why does the default copy constructor not call the Base Constructor but when I include a user-defined copy-constructor it calls the parent constructor?

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

注意你的代码:

forum_troll ft { };
troll t { ft };

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

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

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

关于C++ Copy Constructor 不调用 Base Constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466377/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com