如何继承方法operator =,clone和dispose

时间:2012-12-04 15:45:52

标签: c++ oop inheritance memory-management

我得到的提示是,对于具有成员变量指针的类,我需要注意在分配时对它们进行适当的内存管理。以下方法旨在避免内存泄漏:

class SomeClass {

SomeClass& SomeClass::operator =(SomeClass& from) {
    // clone
    if (&from != this) {
        this->dispose();
        this->clone(from);
    }
    return *this;
}

void SomeClass::clone(const SomeClass& from) {
    this->array = from.array;
}

void SomeClass::dispose() {
    delete[] this->array;
}
};

假设到目前为止这是正确的,是否可以执行以下操作:

定义一个实现Object的超类operator=,并使用抽象方法clonedispose。任何带有指针成员的类都应该Object作为超类,以便它继承operator=,并提醒我需要实现clonedispose

  • 这样的超类怎么样?
  • 通过继承来做这件事是个好主意吗?

1 个答案:

答案 0 :(得分:2)

没有!不要这样做。

首先,将您的operator=()声明为

SomeClass& SomeClass::operator =(const SomeClass& from);

注意const。在新的C ++ 11标准中,还有另一种形式,它允许您在示例中显示的移动语义,但随后您将赋值运算符声明为

SomeClass& SomeClass::operator =(SomeClass&& from);

注意&&

有关此主题的深入讨论,请查找rule of three或在C ++ 11中rule of five

现在问题,赋值运算符不会被继承。如果未在派生类中定义赋值运算符,编译器将生成默认值并隐藏基类的赋值运算符。因此,您的基类的赋值运算符将永远不会被看到,并且永远不会被派生类的客户端使用。

有关赋值运算符的更多讨论,请参阅示例What is the copy-and-swap idiom?