2016-11-07 41 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();