为什么默认的复制构造函数不会调用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";
}
答案 0 :(得分:1)
为什么默认的复制构造函数不会调用Base Constructor,但是当我包含一个用户定义的复制构造函数时,它会调用父构造函数?
所谓的是monster
基类的复制构造函数(不是默认构造函数)。原因是在调用troll
的默认生成的复制构造函数之前,其基类的复制构造函数(即:monster
被称为。
注意你的代码:
forum_troll ft { };
troll t { ft };
在第二个语句中,很明显将调用troll
的默认生成的复制构造函数(因为您没有提供任何用户定义的复制构造函数)。它是monster
的复制构造函数(在troll
的复制构造函数之前),而不是它的默认构造函数,因为这是默认复制构造函数的作用,即:调用base的副本构造
这种默认行为是有道理的,因为troll
的基类是monster
(troll
对象是monster
对象)。因此,在复制构建troll
之前,必须复制monster
。
当您为troll
提供用户定义的复制构造函数时,您可能没有显式调用monster
的复制构造函数,因此monster
默认构造函数被调用。