Ini mungkin tampak seperti pertanyaan sederhana, tetapi saya tidak dapat menemukan jawabannya di tempat lain.
Misalkan saya memiliki yang berikut:
class Abstract {
public:
virtual void foo() = 0;
virtual void bar();
}
class Derived : Abstract {
public:
virtual void foo();
}
Apakah ok class Derived tidak mengimplementasikan fungsi bar ()? Bagaimana jika tidak SEMUA kelas turunan saya membutuhkan fungsi bar (), tetapi beberapa membutuhkan. Apakah semua fungsi virtual dari kelas dasar abstrak perlu diimplementasikan di kelas turunan, atau hanya yang virtual murni? Terima kasih
sumber
Derived::bar
punya fungsi body, yaituAbstract::bar
. Jadi tampaknya unit terjemahan di mana itu didefinisikan (apakah itu bahkan ditentukan di mana saja?) Tidak ditautkan ke unit terjemahan tempat ia dipanggil.They only need to implement the pure ones.
Ini menyesatkan. Kelas turunan juga tidak perlu mengimplementasikan fungsi virtual murni .Hanya metode virtual murni yang harus diimplementasikan di kelas turunan, tetapi Anda masih memerlukan definisi (dan bukan hanya deklarasi) dari metode virtual lainnya. Jika Anda tidak memberikannya, linker mungkin akan mengeluh.
Jadi, hanya menempatkan
{}
setelah metode virtual opsional Anda memberi Anda implementasi default kosong:class Abstract { public: virtual void foo() = 0; // pure virtual must be overridden virtual void bar() {} // virtual with empty default implementation }; class Derived : Abstract { public: virtual void foo(); };
Implementasi default yang lebih terlibat akan masuk ke file sumber terpisah.
sumber
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]
Jadi Anda harus membuat fungsi virtual murni atau memberikan definisi untuk itu.
The gcc faq doccuments itu juga:
sumber
Ya, tidak apa-apa ... Anda hanya perlu mengimplementasikan fungsi virtual murni apa pun untuk membuat instance kelas yang diturunkan dari kelas dasar abstrak.
sumber
Ya, Benar bahwa kelas Turunan harus MENGATASI fungsi yang Virtual Murni di Kelas Induk. Kelas induk yang memiliki Fungsi Virtual Murni disebut Kelas Abstrak hanya karena kelas Anak itu harus memberikan Fungsi Virtual Murni pada tubuhnya sendiri.
Untuk Fungsi Virtual Normal: - Tidak perlu menimpanya lebih lanjut, karena beberapa kelas anak mungkin memiliki fungsi itu, beberapa mungkin tidak.
Tujuan utama dari mekanisme Virtual Function adalah Run Time Polymorphism, apakah tujuan utama dari Pure Virtual Function (Kelas Abstrak) adalah untuk mewajibkan memiliki nama Fungsi yang sama dengan tubuhnya.
sumber