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