Sanal fonksiyonlar parametre alabilir?
Eğer ilan ediyorum bir temel sınıf (veya arayüz sınıfı) ve varsayılan değeri belirtmek için bir veya daha fazla parametre, türetilmiş sınıfları belirtmek için aynı varsayılan değilse varsayılan olarak tezahür eder bu türetilmiş sınıfları?
Ek: ayrıca bu farklı Derleyiciler arasında ele olabilir nasıl ilgileniyorum ve herhangi bir giriş üzerinde "" bu senaryoda uygulama. tavsiye
CEVAP
Sanal olanı varsayılan ayarlar olabilir. Temel sınıfın varsayılan türetilmiş sınıflar tarafından miras alınmaz.
Varsayılan -- yani, temel sınıf veya türetilmiş bir sınıf' -- statik türü işlevi çağrısı yapmak için kullanılan tarafından belirlenir. Eğer temel sınıf bir nesne, gösterici ya da referans ile arama yaparsanız, varsayılan temel sınıf olarak ifade kullanılır. Eğer türetilmiş bir sınıf bir nesne, gösterici ya da referans yoluyla ararsan tersine, varsayılan türetilmiş bir sınıf içinde ifade kullanılır. Bu gösteren Standart tırnak altında bir örnek yoktur.
Bazı Derleyiciler farklı bir şey yapmak olabilir, ama bu C 03 C 11 Standartlar şöyle der:
(EDİT: C 11 Standart aynı şeyi söylüyor
8.3.6.10:
Sanal işlev çağrısı (10.3) kullanır bu varsayılan bağımsız değişkenleri sanal işlevin bildirimi kararlı işaretçi veya başvuru statik tip nesne gösteren tarafından. Bir geçersiz kılan bir türetilmiş fonksiyonu sınıf işlevi varsayılan argümanlar elde değil geçersiz kılar. [Örnek:
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()
}
—end example]
EditBurada varsayılan aldım ne göstermek için örnek bir program. Sadece kısaltma -- class
struct
class
yerine burada es kullanıyorum ve struct
tam olarak varsayılan görünürlük hariç hemen hemen her şekilde aynıdır.
#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)
Base 42
Der 42
Der 84
Güvenli kılma C sanal fonksiyonlar...
Sanal fonksiyonlar ve performans - C ...
Arama sanal fonksiyonlar içinde kurucu...
Angularjs yolları isteğe bağlı paramet...
Fonksiyonlar içinde fonksiyonlar alabi...