派生类上的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_cast(对)之类的东西?我想我在哪里看到过。 @Lucas,不需要强制转换。分配给void* 时,您只会转换(可能),就像在void *foo = static_cast<void*>(myInstance); 中一样。此外,没有什么要转换的,您只是调用基本函数。

以上是关于派生类上的C ++赋值运算符实现[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中怎样实现对二维数组元素进行赋值并输出。

使用移动从派生类分配基础数据会产生错误[重复]

C/C++ 赋值运算符实现的低级细节。它返回啥?

+=和=+ C赋值运算符有啥区别[重复]

C ++中重载赋值运算符的返回类型[重复]

java数组实现买彩票(重复则重新遍历查询思想)