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.