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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.