Nghĩa là gì?


92

Tôi có 2 lớp:

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

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

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

Tôi không biết làm thế nào tôi có thể Google nó 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 nó quan trọng:

class base : public QAbstractGraphicsShapeItem

32
Đó là một nhãn hiệu .
chris

20
Đây là một trường hợp bật cảnh báo giúp, xem nó sống ... warning: label 'base' defined but not used [-Wunused-label]... có lẽ chúng ta cần thêm này yêu cầu một trang câu hỏi: Bạn đã thử bật cảnh báo
Shafik Yaghmour

6
Điều đó kết thúc với một tràn ngăn xếp. Thật thích hợp!
Laurent LA RIZZA

Câu trả lời:


125
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, hàm gây tràn ngăn xếp.


1
vâng, tôi đã phát hiện ra 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

có cảnh báo cho điều này có sẵn trong gcc / clang, v.v. không?
nonsensation

10
@Serthy, Khi tôi sử dụng -Wall, tôi nhận được thông báo cảnh báo: Treaty.cc:3:4: warning: đã xác định nhãn 'base' nhưng không được sử dụng [-Wunused-label] base: // Nhãn chưa được sử dụng.
R Sahu

10
@Serthy: IIRC Visual Studio có cảnh báo "đệ quy trên tất cả các đường dẫn điều khiển" cho điều này.
MSalters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.