【发布时间】:2018-07-23 21:52:08
【问题描述】:
我无法理解以下代码中崩溃的原因:
class A {
public:
virtual ~A() { goo(); }
void goo() { absFoo(); }
virtual void absFoo() = 0;
};
class B : public A {
public:
void absFoo() { cout << "In B \n"; }
};
int main()
{
B b1;
b1.goo();
}
main按预期打印“In B”,但最后当它崩溃时,我也无法调试它,编译器弹出一条奇怪的消息。
所以我的问题是,当 A 的析构函数调用“goo()”时,“absFoo()”会崩溃吗 因为我们指的是抽象函数?
或者编译器真的会在派生类中寻找定义吗?(而且它已经不存在了,因为它事先被破坏了所以它崩溃了)
我知道如果我们直接从析构函数中调用“absFoo()”,原因应该是抽象函数。但由于这里是一个调用“absFoo()”的外部函数,我无法理解真正的原因。
【问题讨论】:
-
aside:main 必须返回 int,而不是 void
-
你实际上不能直接从
A的析构函数调用absFoo。在这种情况下,程序将无法编译,句号。 -
原因是非法的。并且语言规范不会保护您免于违反此规则。
-
这看起来类似于另一个问题stackoverflow.com/questions/12092933/…
-
@Martin - 您已经拥有问题的答案。 :-) 在单独的函数中隐藏
absFoo调用没有区别 - 当您输入 A 时,B 的析构函数已经消失,this的动态类型为A*。
标签: c++ constructor crash virtual abstract