这个c ++程序有什么问题?它核心转储

时间:2016-11-07 08:45:21

标签: c++

为什么核心转储?它首先调用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;
}

3 个答案:

答案 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();