在派生类中使用基类复制 CTOR
Use base class Copy CTOR in derived class
我知道有很多关于这个主题的帖子,但我找不到任何帖子来完全回答我的问题。
假设我有一个基类和一个派生类,我为其实现了一个 CCtor 和一个赋值运算符,如下所示:
class Base {
char * name;
....
Base(const Base& other) :name(nullptr) { *this = other }
void operator=(const Base& other) { ... Deep copy of name }
}
class Derived : public Base {
....
Derived(const Derived& other) { *this = other ; }
void operator=(const Derived& other) {
Base::operator=(other);
.....
}
现在我对这个设计有一些疑问。
- 这是适合这种情况的设计吗? 如果我有第三个类,在基类
- 和派生类之间,但它只包含基元类型,我应该在哪里复制它们? 例如,使用第二个类的默认赋值运算符? 建造一个新的? 只在第三级复制它们?
- 我可以类似地在派生类 CCtor 中调用基类 CCtor,而不是赋值运算符。有什么区别?如果我将它们放在两种方法中,它会尝试复制两次值吗?
编辑:澄清一下,设计是我在项目中得到的..我有指针,所以我必须使用深副本.
这是适合这种情况的设计吗?
不,通常不会。更惯用的方法是停止像char* name
这样的手动管理内存,并使用std::string
或其他执行正确操作的类型:
Class Base {
std::string name;
....
Base(const Base& other) = default;
Base& operator=(const Base& other) = default;
};
(请注意,赋值运算符应返回对类的引用,而不是void
(。
或者将内存管理封装在专门用于此目的的类设计中(但std::string
已经是该类型(。
如果你真的需要以愚蠢容易出错的方式做到这一点,那么实现你的复制构造函数来做复制:
Base(const Base& other) { / * deep copy of name */ }
然后将赋值实现为复制和交换:
Base& operator=(const Base& other)
{
Base tmp(other);
this->swap(tmp);
return *this;
}
这意味着您需要一个便宜的、非抛出的swap(Base&)
成员函数。
在任何情况下,派生的类型复制构造函数都是愚蠢的。基类有一个正确的复制构造函数,因此它应该是:
Derived(const Derived& other) : Base(other) { }
并且分配可以使用基本分配:
Derived& operator=(const Derived& other)
{
Base::operator=(other);
return *this;
}
但是手动编写这些是不必要的,您可以默认其复制操作,无论如何都会做正确的事情:
class Derived : public Base {
public:
Derived(const Derived&) = default;
Derived& operator=(const Derived& ) = default;
如果我有第三个类,在基类和派生类之间,但它只包含基元类型,我应该在哪里复制它们? 例如,使用第二个类的默认赋值运算符? 建造一个新的? 只在第三级复制它们?
还应使用= default
定义该类的复制构造函数和赋值运算符。一旦你用正确的行为使Base
复制变得安全,编写其他类来使用它就变得微不足道了。默认行为将执行正确的操作。仅当需要对 RAII 类型未正确管理的动态分配内存之类的内容进行特殊处理时,才需要手动定义这些操作。
我可以类似地在派生类 CCtor 中调用基类 CCtor,而不是赋值运算符。有什么区别?
如果要复制构造,请使用复制构造函数,而不是赋值。为工作使用正确的功能。
- 是否可以初始化不可复制类型的成员变量(或基类)
- 基类的填充将被复制到派生类中
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何复制只引用基类的派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 不可复制基类的聚合初始化
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- 在派生类中使用基类复制 CTOR
- 复制派生类更改基类的构造函数
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 当派生类的基类具有成员指针时,对其进行深层复制
- 试图在具有std ::任何构造函数的基类中调用复制构造函数的问题
- 如何从基类 c++ 复制字段
- 用基类复制构造函数c++并派生类
- 这两种调用基类复制赋值的方法有什么区别
- 为什么隐式复制构造函数调用基类复制构造函数,而定义的复制构造函数不调用?
- 如何从派生类复制构造函数调用基类复制构造函数