Sanalların varsayılan değerleri olabilir. Temel sınıftaki varsayılanlar türetilmiş sınıflar tarafından miras alınmaz.
Hangi varsayılan kullanılır - yani, temel sınıf 'veya türetilmiş bir sınıf' - işleve çağrı yapmak için kullanılan statik tür tarafından belirlenir. Bir temel sınıf nesnesi, işaretçi veya başvuruyu çağırırsanız, temel sınıfta belirtilen varsayılan değer kullanılır. Tersine, türetilmiş bir sınıf nesnesi, işaretçi veya referansı çağırırsanız türetilmiş sınıfta belirtilen varsayılanlar kullanılır. Standart teklifin altında bunu gösteren bir örnek vardır.
Bazı derleyiciler farklı bir şey yapabilir, ancak C ++ 03 ve C ++ 11 Standartlarının söylediği budur:
8.3.6.10:
Sanal işlev çağrısı (10.3), sanal işlevin bildiriminde, işaretçiyi veya nesneyi gösteren başvuruyu statik türüyle belirlenen varsayılan bağımsız değişkenleri kullanır. Türetilmiş bir sınıftaki geçersiz kılma işlevi, geçersiz kıldığı işlevden varsayılan bağımsız değişkenler almaz. Misal:
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()
}
Hangi varsayılanların alındığını gösteren örnek bir program. struct
Burada class
sadece kısalık için es yerine s kullanıyorum - class
ve struct
varsayılan görünürlük dışında hemen hemen her şekilde aynı.
#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;
}
Bu programın çıktısı (MSVC10 ve GCC 4.4'te):
Base 42
Der 42
Der 84