在复制赋值操作符中赋值基类成员
Assigning base class members in copy assignment operator
我有一个从MSFT类继承的类,因此不能更改,我希望派生类的复制构造函数和复制赋值操作符具有相同的行为。我遇到的问题是,在复制构造函数中,您可以自由地在初始化列表中调用基类的构造函数,但在操作符中,这不是一个选项。如何在赋值操作符中正确地重新创建此行为?仅仅在操作符重载的主体中调用基类的构造函数是否足够?
附加注意:基类继承自CObject,后者将operator=()和复制构造函数作为私有和未实现的方法,因此不幸的是,对这些方法的任何调用都会导致编译错误。
我在下面提供了一个简化的代码场景:类声明:
class Base
{
protected:
int baseInt;
public:
Base(int);
}
class Derived : public Base
{
public:
Derived(const Derived& other);
Derived& operator=(const Derived& rhs);
private:
int derivedInt;
}
派生类成员函数:
// Copy Constructor
Derived(const Derived& other) : Base(5)
{
derivedInt = other.derivedInt;
}
// Copy Assignment Operator
Derived& operator=(const Derived& rhs)
{
if (&rhs != this)
{
derivedInt = other.derivedInt;
return *this;
}
}
编辑:更新语法和添加CObject注释
一般情况下,您可以通过显式调用基类子对象的operator=,或者使用copy&swap习惯用法(如果可用)来实现:
//explicit call to base operator=
Derived& operator=(const Derived& rhs)
{
Base::operator=(rhs); //
derivedInt = rhs.derivedInt;
return *this;
}
//or copy&swap:
Derived& operator=(const Derived& rhs)
{
Derived tmp(rhs); //copy
tmp.swap(*this);
return *this;
}
void swap(Derived& other)
{
Base::swap(other);
std::swap(derivedInt,other.derivedInt);
}
Update:因为你的基类不应该被复制分配,你的派生类也不应该被复制分配。在某些情况下,类包含不可复制的部分,但完全可复制。在这些情况下,不可复制部分是不直接影响类对象状态的部分,例如唯一ID。那么这些部分通常不会在分配过程中被更改。然而,在这些情况下,不可复制的部分不应该由继承包含,而应该由聚合包含。
简短地说:继承意味着"is-A"关系。你的基地不能被复制。你的派生是一个基。因此,派生文件也不能复制。
像这样
Derived& operator=(const Derived& rhs)
{
Base::operator=(rhs);
derivedInt = rhs.derivedInt;
return *this;
}
相关文章:
- 派生类看不到基类成员
- C++11: 如何访问派生类中的基类成员?
- Qml 未收到基类成员变量的更新值
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 初始化基类成员 (c++) 的首选方法
- 访问多级复合关系中的基类成员
- 允许从特定派生类访问基类成员
- 在派生类的成员联合中包含继承的基类成员
- 由派生类设置的 constexpr 基类成员
- 从派生类调用的抽象基类成员函数
- 从抽象基类访问另一个基类成员
- C++派生类访问基类成员
- 不能引用派生模板类中的基类成员
- C2694 在析构函数上,当基类成员的析构函数具有非空 noexcept 说明符和主体时
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
- 在C 中访问带有不正确的下属的基类成员
- C++将基类成员链接到派生类成员
- 从基类成员函数返回派生类的实例
- 从指针到基类成员的模板推导
- 是否可以从派生类中排除基类成员?