2015-05-22 33 views
86

tôi có 2 lớp:Điều gì: nghĩa là gì?

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

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

Tôi đã phạm sai lầm và viết base:foo(); thay vì base::foo();. Mã đã được biên dịch và chạy, nhưng bị phân đoạn.

Tôi không biết làm cách nào để Google có thể và không biết nó là gì, nhưng tôi rất quan tâm: điều đó có nghĩa là gì?

base:foo(); 

Nếu điều quan trọng là:

class base : public QAbstractGraphicsShapeItem 
+31

Đó là [nhãn] (http://en.cppreference.com/w/cpp/language/goto). – chris

+19

Đây là trường hợp bật cảnh báo giúp, xem [live] (http://melpon.org/wandbox/permlink/ey2lvaSxYPlkjsXG) ... 'warning: label 'base' được xác định nhưng không được sử dụng [-Wunused-label ] '... có lẽ chúng ta cần phải thêm điều này yêu cầu một trang câu hỏi: * Bạn đã thử bật cảnh báo * –

+6

Điều đó kết thúc với một tràn ngăn xếp. Làm thế nào thích hợp! –

Trả lời

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

tương đương với:

void foo() 
{ 
    base: // An unused label. 
    foo(); // Calls the function again, resulting in infinite recursion. 
} 

Do đệ quy vô hạn, chức năng gây ra stack overflow.

+1

có, tôi đã tìm thấy lỗi đó khi tôi thấy nhiều cuộc gọi 'foo()' trong ngăn xếp cuộc gọi. cảm ơn – railmisaka

+0

có cảnh báo về tính năng này trong gcc/clang, v.v. không? – nonsensation

+9

@Serthy, Khi tôi sử dụng '-Wall', tôi nhận được thông báo cảnh báo: * socc.cc: 3: 4: warning: label 'base' được xác định nhưng không được sử dụng [-Wunused-label] base: // An unused nhãn. * –