Standar ISO C ++ menetapkan bahwa semua metode virtual kelas yang bukan virtual murni harus ditentukan.
Sederhananya, aturannya adalah:
Jika kelas turunan Anda menimpa metode virtual kelas Basis maka ia harus memberikan definisi juga. Jika tidak, kelas Basis harus memberikan definisi metode itu.
Sesuai aturan di atas dalam contoh kode Anda, virtual void bar();
membutuhkan definisi di kelas Base.
Referensi:
C ++ 03 Standar: 10.3 Fungsi virtual [class.virtual]
Fungsi virtual yang dideklarasikan dalam kelas harus didefinisikan, atau dideklarasikan murni (10.4) di kelas itu, atau keduanya; tetapi tidak diperlukan diagnosis (3.2).
Jadi Anda harus membuat fungsi virtual murni atau memberikan definisi untuk itu.
The gcc faq doccuments itu juga:
Standar ISO C ++ menetapkan bahwa semua metode virtual kelas yang bukan virtual murni harus ditentukan, tetapi tidak memerlukan diagnostik apa pun untuk pelanggaran aturan ini [class.virtual]/8
. Berdasarkan asumsi ini, GCC hanya akan memancarkan konstruktor yang didefinisikan secara implisit, operator penugasan, destruktor, dan tabel virtual kelas di unit terjemahan yang mendefinisikan metode non-inline pertamanya.
Oleh karena itu, jika Anda gagal untuk mendefinisikan metode khusus ini, penaut mungkin mengeluh tentang kurangnya definisi untuk simbol yang tampaknya tidak terkait. Sayangnya, untuk memperbaiki pesan kesalahan ini, mungkin perlu mengubah linker, dan ini tidak selalu bisa dilakukan.
Solusinya adalah memastikan bahwa semua metode virtual yang tidak murni ditentukan. Perhatikan bahwa destruktor harus ditentukan meskipun ia dideklarasikan sebagai virtual-murni [class.dtor]/7
.