Virtual mungkin memiliki default. Default di kelas dasar tidak diwarisi oleh kelas turunan.
Default mana yang digunakan - yaitu, kelas dasar 'atau kelas turunan' - ditentukan oleh tipe statis yang digunakan untuk membuat panggilan ke fungsi. Jika Anda memanggil objek kelas dasar, penunjuk atau referensi, standar yang ditunjukkan dalam kelas dasar digunakan. Sebaliknya, jika Anda memanggil objek kelas turunan, penunjuk atau referensi standar yang ditunjukkan dalam kelas turunan digunakan. Ada contoh di bawah kutipan Standar yang menunjukkan ini.
Beberapa kompiler mungkin melakukan sesuatu yang berbeda, tetapi inilah yang dikatakan oleh Standar C ++ 03 dan C ++ 11:
8.3.6.10:
Panggilan fungsi virtual (10.3) menggunakan argumen default dalam deklarasi fungsi virtual yang ditentukan oleh tipe statis dari pointer atau referensi yang menunjukkan objek. Fungsi utama dalam kelas turunan tidak memperoleh argumen default dari fungsi yang ditimpanya. Contoh:
struct A {
virtual void f(int a = 7);
};
struct B : public A {
void f(int a);
};
void m()
{
B* pb = new B;
A* pa = pb;
pa->f(); //OK, calls pa->B::f(7)
pb->f(); //error: wrong number of arguments for B::f()
}
Berikut adalah contoh program untuk menunjukkan default apa yang diambil. Saya menggunakan struct
s di sini daripada class
es hanya untuk singkatnya - class
dan struct
persis sama di hampir setiap cara kecuali visibilitas standar.
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
using std::stringstream;
using std::string;
using std::cout;
using std::endl;
struct Base { virtual string Speak(int n = 42); };
struct Der : public Base { string Speak(int n = 84); };
string Base::Speak(int n)
{
stringstream ss;
ss << "Base " << n;
return ss.str();
}
string Der::Speak(int n)
{
stringstream ss;
ss << "Der " << n;
return ss.str();
}
int main()
{
Base b1;
Der d1;
Base *pb1 = &b1, *pb2 = &d1;
Der *pd1 = &d1;
cout << pb1->Speak() << "\n" // Base 42
<< pb2->Speak() << "\n" // Der 42
<< pd1->Speak() << "\n" // Der 84
<< endl;
}
Output dari program ini (pada MSVC10 dan GCC 4.4) adalah:
Base 42
Der 42
Der 84