gpt4 book ai didi

c++ - 如何继承方法 operator=、clone 和 dispose

转载 作者:行者123 更新时间:2023-11-28 03:26:44 25 4
gpt4 key购买 nike

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

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;
}
};

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

定义一个父类(super class) Object,它实现了 operator= 并具有抽象方法 clonedispose。任何具有指针成员的类都应该将 Object 作为父类(super class),以便它继承 operator= 我被提醒我需要实现 clone处理

  • 这样的父类(super class)会是什么样子?
  • 通过继承来做到这一点是个好主意吗?

最佳答案

不!不要这样做。

首先,将您的 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? .

关于c++ - 如何继承方法 operator=、clone 和 dispose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13706614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com