【发布时间】: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