Bagaimana cara memanggil fungsi induk dari kelas turunan menggunakan C ++? Sebagai contoh, saya memiliki kelas yang disebut parent
, dan kelas yang disebut child
yang berasal dari orang tua. Di dalam setiap kelas ada print
fungsi. Dalam definisi fungsi cetak anak, saya ingin melakukan panggilan ke fungsi cetak orang tua. Bagaimana saya bisa melakukan ini?
c++
oop
inheritance
IaCoder
sumber
sumber
Jawaban:
Saya akan mengambil risiko menyatakan yang sudah jelas: Anda memanggil fungsi, jika itu didefinisikan dalam kelas dasar itu secara otomatis tersedia di kelas turunan (kecuali jika itu
private
).Jika ada fungsi dengan tanda tangan yang sama di kelas turunan, Anda dapat mendisambiguasinya dengan menambahkan nama kelas dasar diikuti oleh dua titik dua
base_class::foo(...)
. Anda harus mencatat bahwa tidak seperti Java dan C #, C ++ tidak memiliki kata kunci untuk "kelas dasar" (super
ataubase
) karena C ++ mendukung multiple inheritance yang dapat menyebabkan ambiguitas.Secara kebetulan, Anda tidak dapat memperoleh langsung dari kelas yang sama dua kali karena tidak akan ada cara untuk merujuk ke salah satu kelas dasar di atas yang lain.
sumber
template<class A, class B> class C: public A, public B {};
dapat datang ke dua jenis yang sama karena alasan tergantung pada bagaimana kode Anda digunakan (yang membuat A dan B menjadi sama), mungkin dua atau tiga lapisan abstraksi jauh dari seseorang yang tidak menyadari apa yang Anda lakukan.using namespace std
.Diberi nama kelas induk
Parent
dan kelas anak bernamaChild
, Anda dapat melakukan sesuatu seperti ini:Perhatikan bahwa itu
Parent
adalah nama aktual kelas dan bukan kata kunci.sumber
foo()
sini analog denganprint()
atau fungsi terpisah? Dan maksud Anda dengan menggunakanprivate
pewarisan untuk menyembunyikan detail yang diwarisi dari pangkalan, dan menyediakanpublic
fungsi bayangan untuk hal-hal yang ingin Anda paparkan?foo()
analog denganprint()
. Biarkan saya kembali menggunakanprint()
karena saya pikir akan lebih masuk akal dalam konteks ini. Katakanlah seseorang membuat kelas yang melakukan beberapa set operasi pada tipe data tertentu, mengekspos beberapa accessor, dan memilikiprint(obj&)
metode. Saya membutuhkan kelas baru yang berfungsiarray-of-obj
tetapi yang lainnya sama. Komposisi menghasilkan banyak kode duplikat. Warisan meminimalkan itu, dalamprint(array-of-obj&)
panggilan putaranprint(obj&)
, tetapi tidak ingin klien memanggilprint(obj&)
karena tidak masuk akal bagi mereka untuk melakukannyaJika kelas dasar Anda dipanggil
Base
, dan fungsiFooBar()
Anda dipanggil, Anda dapat memanggilnya langsung menggunakanBase::FooBar()
sumber
Di MSVC ada kata kunci khusus Microsoft untuk itu: __super
MSDN: Memungkinkan Anda untuk secara eksplisit menyatakan bahwa Anda memanggil implementasi kelas dasar untuk fungsi yang Anda timpa.
sumber
typdef
orang tua sebagai sesuatu sepertisuper
.__super
; Saya sebutkan di sini sebagai saran alternatif. Pengembang harus mengetahui kompiler mereka dan memahami pro dan kontra dari kemampuannya.Jika pengubah akses fungsi anggota kelas dasar dilindungi ATAU publik, Anda dapat melakukan fungsi panggilan anggota kelas dasar dari kelas turunan. Panggilan ke kelas dasar fungsi anggota non-virtual dan virtual dari fungsi anggota turunan dapat dibuat. Silakan merujuk program.
Keluaran:
sumber
virtual
!Panggil metode induk dengan operator resolusi lingkup induk.
sumber
Contoh referensi.
sumber