派生类上的C ++赋值运算符实现[重复]
Posted
技术标签:
【中文标题】派生类上的C ++赋值运算符实现[重复]【英文标题】:C++ assignment operator implementation on derived class [duplicate] 【发布时间】:2016-01-28 16:53:27 【问题描述】:假设我有一个如下所示的基类:
class Base
public:
Base() baseMember = new int( 10 );
Base &operator=( const Base &right )
baseMember = new int( *(right.baseMember) );
return *this;
protected:
int *baseMember;
;
现在我想拥有一个继承自 Base 的 Derived 类,并拥有一个名为derivedMember 的新指针成员:
class Derived : public Base
public:
Derived():Base() derivedMember = new double( 10.1 );
Derived &operator=( const Derived &right )
/*some implementation */
private:
double *derivedMember;
;
我应该如何以一种可以调用基类 operator= 的方式在派生类上实现 operator= 并避免在派生类上重写基类 operator= 实现?简而言之,我怎样才能避免这样做:
Derived &operator=(const Derived &right )
baseMember = new int( *(right.baseMember) ); //this is what I want to avoid rewriting
derivedMember = new double( *(right.derivedMember) );
return *this;
【问题讨论】:
为什么不使用智能指针?上面的代码有内存泄漏 哪些泄漏?我自己看不到... 构造函数使用new
来初始化baseMember
。这在赋值运算符中被覆盖,而没有使用删除
@EdHeal 我现在看到了。我只是跳过了删除的事情来简单的示例代码。我正在工作的这个问题出现的类正确使用了删除。无论如何,谢谢你的提示。我会看看那些智能指针。
【参考方案1】:
像这样:
Derived &operator=(const Derived &right )
if (&right == this) return *this; // prevent assigning to self
Base::operator=(right);
delete derivedMember; // remember to release any assigned memory (assumes derivedMember is assigned a default of nullPtr)
derivedMember = new double( *(right.derivedMember) );
return *this;
【讨论】:
不妨在开头加上测试if (&right == this) return *this;
@EdHeal 是的,这是个好主意。
@Lucas,记得删除赋值运算符中任何已分配的内存。或者,你可以说*derivedMember = *right.derivedMember;
@Gread.And.Powerful.Oz 谢谢你的提醒。第二个技巧真的很有用,我不知道为什么没有想到它:) 关于答案本身,在调用 Base::operator 时,我是否应该使用 static_castvoid*
时,您只会转换(可能),就像在void *foo = static_cast<void*>(myInstance);
中一样。此外,没有什么要转换的,您只是调用基本函数。以上是关于派生类上的C ++赋值运算符实现[重复]的主要内容,如果未能解决你的问题,请参考以下文章