为什么核心转储?它首先调用derived的foo,在foo的方法中,它调用base的foo,对吗?
struct base {
virtual void foo() {};
};
struct derived : public base {
void foo() { base:foo(); }
};
int main() {
base* b = new derived();
b->foo();
delete b;
}
答案 0 :(得分:6)
程序崩溃,因为堆栈溢出。这是因为你永远递归地呼叫foo()
struct derived : public base {
void foo() { base:foo(); }
};
重要的部分是base:foo();
,看到缺少的结肠?这与标签相同,然后调用foo();
base:
foo();
无关,当你用gcc和选项-Wall
构建它时,你会得到两个警告
a.cpp: In member function 'virtual void derived::foo()': a.cpp:6:18: warning: label 'base' defined but not used [-Wunused-label] void foo() { base:foo(); } ^ a.cpp: In function 'int main()': a.cpp:13:12: warning: deleting object of polymorphic class type 'base' which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor] delete b; ^
答案 1 :(得分:6)
base:foo();
中缺少一个冒号,奇怪的是它变成了一个标签和一个递归调用。
void foo()
{
base:
foo();
}
添加第二个:使其成为对基类函数base::foo();
答案 2 :(得分:1)
你失去了一个':'。
base:foo();
应为base::foo();