gpt4 book ai didi

c++ - "The Rule of Zero"是否也适用于具有虚方法的类?

转载 作者:可可西里 更新时间:2023-11-01 16:39:31 24 4
gpt4 key购买 nike

我找到了 The rule of Zero正如在 Peter Sommerlads Slides 中也提到的那样(第 32 页)非常引人注目。

虽然,我似乎记得有一个严格的规则,必须定义析构函数 virtual如果类有 < strong>虚拟成员并且实际上是派生的。

struct Base {
virtual void drawYourself();
virtual ~Base() {}
};
struct Derived : public Base {
virtual void drawYourself();
};

析构函数的主体甚至可以是空的(它只需要 vtbl 中的条目)。

我好像记得用hierarchy的时候

int main() {
Base *obj = new Derived{};
obj->drawYourself(); // virtual call to Derived::drawYourself()
delete obj; // Derived::~Derived() _must_ be called
}

那么delete obj调用正确的析构函数就很重要了。是否正确,如果我完全省略析构函数定义,它将不会变为虚拟,因此会调用错误的 d'tor?

struct Base {
virtual void drawYourself();
// no virtual destructor!
};

这引出了我的最后一个问题:

  • “零规则”在具有虚方法的层次结构中是否也适用
  • 或者在这些情况下我是否需要定义虚拟析构函数?

编辑:正如我在回答中提醒的那样,我的问题的 1sr 版本有错误的假设。相关(虚拟)析构函数在 Base 中,而不是在 Derived 中。但我的问题是:我是否需要声明(虚拟)析构函数?

最佳答案

实际上是基类析构函数必须声明为virtual,并且在派生类中自动为virtual:

struct Base {
virtual void drawYourself();
virtual ~Base() = default;
};

struct Derived : public Base {
virtual void drawYourself();
};

但除此之外,零规则仍然成立。

如果你按照你做的方式去做,或者如果你省略了 virtual 析构函数,当通过基类delete派生对象时,你只会得到未定义的行为指针。

关于c++ - "The Rule of Zero"是否也适用于具有虚方法的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637250/

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