2016-11-07 74 views
1

为什么它的核心转储?它首先调用派生的foo,在foo的方法中,它调用基地的foo,对吧?这个C++程序有什么问题?它核心转储

struct base { 
    virtual void foo() {}; 
}; 

struct derived : public base { 
    void foo() { base:foo(); } 
}; 

int main() { 
    base* b = new derived(); 
    b->foo(); 

    delete b; 
} 
+2

我的编译器警告我:' '基地':未引用label'。这铃响了。 –

+3

这就是为什么您启用警告并修复它们的原因。用* gcc *和* clang *试试'-Wall -Wextra'来获得一组非常合理的基本警告,并添加'-Werror'来强制自己修复它们。我似乎记得'/ W:4'对于MSVC是可以的,但是谷歌或者试用一下。 – hyde

回答

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; 
       ^
+0

这是包含崩溃实际原因的答案:堆栈溢出。 – hyde

6

你在base:foo();中缺少一个冒号,奇怪地将它变成标签和递归调用。

void foo() 
{ 
    base: 
    foo(); 
} 

添加第二个:使其基类功能base::foo();

1

呼叫你失去一个“:”。

base:foo();应该base::foo();