Terlepas dari semua seruan untuk mendeklarasikan anggota virtual sebagai pribadi, argumen tersebut tidak masuk akal. Seringkali, kelas turunan yang menggantikan fungsi virtual harus memanggil versi kelas dasar. Tidak bisa jika dideklarasikan private
:
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
Anda harus mendeklarasikan metode kelas dasar protected
.
Kemudian, Anda harus mengambil langkah buruk untuk menunjukkan melalui komentar bahwa metode tersebut harus diganti tetapi tidak dipanggil.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Jadi, pedoman Herb Sutter # 3 ... Tapi kudanya sudah keluar dari kandang.
Saat Anda mendeklarasikan sesuatu, protected
Anda secara implisit mempercayai penulis kelas turunan mana pun untuk memahami dan menggunakan internal terlindungi dengan benar, seperti halnya friend
deklarasi menyiratkan kepercayaan yang lebih dalam bagi private
anggota.
Pengguna yang mendapatkan perilaku buruk karena melanggar kepercayaan itu (misalnya diberi label 'tidak mengerti' dengan tidak repot-repot membaca dokumentasi Anda) hanya menyalahkan diri mereka sendiri.
Pembaruan : Saya memiliki beberapa umpan balik yang mengklaim Anda dapat "merangkai" implementasi fungsi virtual dengan cara ini menggunakan fungsi virtual pribadi. Jika demikian, saya pasti ingin melihatnya.
Kompiler C ++ yang saya gunakan pasti tidak akan membiarkan implementasi kelas turunan memanggil implementasi kelas dasar pribadi.
Jika komite C ++ melonggarkan "pribadi" untuk mengizinkan akses khusus ini, saya akan memilih semua fungsi virtual pribadi. Saat ini, kami masih disarankan untuk mengunci pintu gudang setelah kudanya dicuri.