【问题标题】:C++ assignment operator implementation on derived class [duplicate]派生类上的C ++赋值运算符实现[重复]
【发布时间】: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 我现在看到了。我只是跳过了删除的事情来简单的示例代码。我正在工作的这个问题出现的类正确使用了删除。无论如何,谢谢你的提示。我会看看那些智能指针。

标签: c++ inheritance operator-overloading


【解决方案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); 中一样。此外,没有什么要转换的,您只是调用基本函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2012-02-12
  • 2014-08-04
  • 2020-02-16
  • 2021-07-31
相关资源
最近更新 更多