【问题标题】:C++ multi-inheritance, error in delete objectC ++多继承,删除对象中的错误
【发布时间】:2021-10-29 22:23:36
【问题描述】:

我创建了这个简单的 C++ 程序:

#include <iostream>

class Base1 {
public:
    virtual void method1() = 0;
};

class Base2 {
public:
    virtual void method2() = 0;
};

class B : public Base1, public Base2 {
public:
    void method1() override {
        std::cout << "method1 from B\n";
    }
    void method2() override {
        std::cout << "method2 from B\n";
    }
};

int main() {
    Base1 *x = new B;
    x->method1();
    delete x;
    return 0;
}

而且效果很好。但是如果我将 main 函数中的代码更改为:

int main() {
    Base2 *x = new B;
    x->method2();
    delete x;
    return 0;
}

当我运行这段代码时,我有这个运行时错误: free(): invalid pointer

为什么当我使用 base2 类并且它与 base1 一起工作时会出现此错误?我该如何解决?

【问题讨论】:

  • 对于多态类,您总是需要虚拟析构函数。您的编译器在您构建时不会发出警告吗?那么请启用更多警告,并将它们视为必须修复的错误。参见例如here to see the warning.
  • 您在这两种情况下都有未定义的行为。两个基类都需要有一个 virtual 析构函数来避免这种情况。未定义的行为可能会产生运行时错误,但同样,它似乎可以正确运行。这就是“未定义”这个词的本质——任何结果都是可能的。

标签: c++ inheritance


【解决方案1】:

如果您打算以多态方式使用基类析构函数,则需要将基类析构函数设为虚拟。

class base1 {
public:
    virtual ~base1() = default;
    virtual void method1() = 0;
};

class base2 {
public:
    virtual ~base2() = default;
    virtual void method2() = 0;
};

class B : public base1, public base2 {
public:
    void method1() override {
        std::cout << "method1 from B\n";
    }
    void method2() override {
        std::cout << "method2 from B\n";
    }
};

【讨论】:

  • 感谢 Someprogrammerdude、Peter 和 Eduard。是的,有了虚拟析构函数,问题就解决了。阻止我的事情是因为问题存在于一种情况而不是另一种情况。不过现在问题解决了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多