Saya sudah jawab saya dalam bentuk percakapan untuk menjadi lebih baik membaca:
Mengapa kita membutuhkan fungsi virtual?
Karena Polimorfisme.
Apa itu Polimorfisme?
Fakta bahwa pointer basis juga dapat menunjuk ke objek tipe turunan.
Bagaimana definisi Polimorfisme mengarah pada kebutuhan akan fungsi virtual?
Nah, melalui penjilidan awal .
Apa yang mengikat awal?
Pengikatan awal (pengikatan waktu kompilasi) dalam C ++ berarti pemanggilan fungsi diperbaiki sebelum program dijalankan.
Begitu...?
Jadi jika Anda menggunakan tipe dasar sebagai parameter fungsi, kompiler hanya akan mengenali antarmuka dasar, dan jika Anda memanggil fungsi itu dengan argumen apa pun dari kelas turunan, itu akan dipotong, yang bukan apa yang Anda inginkan terjadi.
Jika bukan itu yang kita inginkan terjadi, mengapa ini dibolehkan?
Karena kita membutuhkan Polimorfisme!
Apa manfaat Polimorfisme?
Anda dapat menggunakan pointer tipe dasar sebagai parameter dari fungsi tunggal, dan kemudian pada saat run-time dari program Anda, Anda dapat mengakses setiap antarmuka tipe turunan (mis. Fungsi anggota mereka) tanpa masalah, menggunakan dereferencing dari single itu pointer dasar.
Saya masih tidak tahu apa fungsi virtual yang bagus untuk ...! Dan ini pertanyaan pertamaku!
baik, ini karena Anda terlalu cepat bertanya!
Mengapa kita membutuhkan fungsi virtual?
Asumsikan bahwa Anda memanggil fungsi dengan basis pointer, yang memiliki alamat objek dari salah satu kelas turunannya. Seperti yang telah kita bahas di atas, dalam run-time, pointer ini mengalami dereferensi, sejauh ini bagus, namun, kami mengharapkan metode (== fungsi anggota) "dari kelas turunan kami" akan dieksekusi! Namun, metode yang sama (yang memiliki header yang sama) sudah didefinisikan di kelas dasar, jadi mengapa program Anda harus repot-repot memilih metode lain? Dengan kata lain yang saya maksud, bagaimana Anda bisa membedakan skenario ini dari apa yang biasanya kita lihat terjadi sebelumnya?
Jawaban singkatnya adalah "fungsi anggota Virtual di basis", dan jawaban yang sedikit lebih lama adalah bahwa, "pada langkah ini, jika program melihat fungsi virtual di kelas dasar, ia tahu (menyadari) bahwa Anda sedang mencoba untuk menggunakan polimorfisme "dan seterusnya pergi ke kelas turunan (menggunakan v-table , suatu bentuk pengikatan akhir) untuk menemukan metode lain dengan header yang sama, tetapi dengan - tanpa diduga - implementasi yang berbeda.
Mengapa implementasi berbeda?
Anda kepala menyerah! Baca buku yang bagus !
OK, tunggu tunggu tunggu, mengapa orang repot-repot menggunakan pointer basis, ketika dia hanya bisa menggunakan pointer jenis turunan? Anda menjadi hakim, apakah semua sakit kepala ini sepadan? Lihatlah dua cuplikan ini:
// 1:
Parent* p1 = &boy;
p1 -> task();
Parent* p2 = &girl;
p2 -> task();
// 2:
Boy* p1 = &boy;
p1 -> task();
Girl* p2 = &girl;
p2 -> task();
OK, walaupun saya pikir 1 masih lebih baik dari 2 , Anda bisa menulis 1 seperti ini juga:
// 1:
Parent* p1 = &boy;
p1 -> task();
p1 = &girl;
p1 -> task();
dan terlebih lagi, Anda harus menyadari bahwa ini belum menggunakan semua hal yang telah saya jelaskan kepada Anda sejauh ini. Alih-alih ini, anggap sebagai contoh situasi di mana Anda memiliki fungsi dalam program Anda yang menggunakan metode dari masing-masing kelas turunan masing-masing (getMonthBenefit ()):
double totalMonthBenefit = 0;
std::vector<CentralShop*> mainShop = { &shop1, &shop2, &shop3, &shop4, &shop5, &shop6};
for(CentralShop* x : mainShop){
totalMonthBenefit += x -> getMonthBenefit();
}
Sekarang, coba tulis ulang ini, tanpa sakit kepala!
double totalMonthBenefit=0;
Shop1* branch1 = &shop1;
Shop2* branch2 = &shop2;
Shop3* branch3 = &shop3;
Shop4* branch4 = &shop4;
Shop5* branch5 = &shop5;
Shop6* branch6 = &shop6;
totalMonthBenefit += branch1 -> getMonthBenefit();
totalMonthBenefit += branch2 -> getMonthBenefit();
totalMonthBenefit += branch3 -> getMonthBenefit();
totalMonthBenefit += branch4 -> getMonthBenefit();
totalMonthBenefit += branch5 -> getMonthBenefit();
totalMonthBenefit += branch6 -> getMonthBenefit();
Dan sebenarnya, ini mungkin juga contoh yang dibuat-buat!