Apa maksudnya?

92

Saya memiliki 2 kelas:

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

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

Saya membuat kesalahan dan menulis base:foo();bukan base::foo();. Kode telah dikompilasi dan dijalankan, tetapi dipisahkan.

Saya tidak tahu bagaimana saya bisa Google dan tidak tahu apa itu, tapi saya sangat tertarik: apa maksudnya?

base:foo();

Jika itu penting:

class base : public QAbstractGraphicsShapeItem
railmisaka
sumber
32
Itu adalah label .
chris
20
Ini adalah kasus di mana menyalakan peringatan membantu, melihatnya langsung ... warning: label 'base' defined but not used [-Wunused-label]... mungkin kita perlu menambahkan ini halaman ajukan pertanyaan: Sudahkah Anda mencoba mengaktifkan peringatan
Shafik Yaghmour
6
Itu diakhiri dengan tumpukan melimpah. Betapa tepat!
Laurent LA RIZZA

Jawaban:

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

setara dengan:

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

Karena rekursi tak terbatas, fungsi tersebut menyebabkan luapan tumpukan.

R Sahu
sumber
1
ya, saya menemukan kesalahan itu ketika saya melihat banyak panggilan foo()di tumpukan panggilan. terima kasih
railmisaka
apakah ada peringatan untuk ini tersedia di gcc / clang dll.?
nonsensation
10
@Serthy, Ketika saya menggunakan -Wall, saya mendapatkan pesan peringatan: socc.cc:3:4: peringatan: label 'base' ditentukan tetapi tidak digunakan [-Wunused-label] base: // Label yang tidak digunakan.
R Sahu
10
@ Serthy: IIRC Visual Studio memiliki peringatan "rekursif di semua jalur kontrol" untuk ini.
MSalters