C++派生类拷贝构造函数是否需要显式调用基类拷贝构造
问题解答
你当前的拷贝构造实现是错误的,必须显式调用基类的拷贝构造函数LevelPlayer(const LevelPlayer&)
- 如果你不在派生类拷贝构造的初始化列表中显式指定基类的构造函数,编译器会默认调用基类的无参默认构造函数,而不会自动执行基类成员的拷贝逻辑。这会导致你拷贝得到的
GroupPlayer对象中,继承自基类的level成员是未初始化的垃圾值,id会被初始化为-1,而非拷贝源对象的对应成员值,完全不符合拷贝构造的预期行为。 - 正确的拷贝构造写法如下:
GroupPlayer::GroupPlayer(const GroupPlayer& player) : LevelPlayer(player), // 显式调用基类拷贝构造,复制level和id ptr(player.ptr != nullptr ? new IdPlayer(*player.ptr) : nullptr) // 补充空指针判断避免空引用异常 {}
额外注意:你当前派生类声明了自定义拷贝构造,还要对应实现符合深拷贝逻辑的拷贝赋值运算符,避免出现内存泄漏、重复释放等经典的C++资源管理问题,符合三五法则的要求。
内容的提问来源于stack exchange,提问作者Raea6789
相关产品推荐
相关产品推荐

