2010-12-10 4 views
6
class Base 
{ 
public: 
Base() 
{ 
cout<<"base class"<<endl; 
fun(); 
} 
virtual void fun(){cout<<"fun of base"<<endl;} 
}; 

class Derive:public Base 
{ 
public: 
Derive() 
{ 
cout<<"derive class"<<endl; 
fun(); 
} 
void fun(){ cout<<"fun of derive"<<endl;} 
}; 

void main() 
{ 
Derive d; 
} 

çıktısı:Neden sanal yöntemim geçersiz kılmıyor?

base class 
fun of base 
derive class 
fun of derive 

Neden ikinci hat fun of derive değil mi?

- Base Class Constructor call 
    | 
    Call to **fun of Base Class** 
- Derived Class Constructor call 
    | 
    Call to **fun of the Derived Class** 

fazla detay

+3

Okuma materyali: ["İnşaat veya İmha Sırasında Sanal Fonksiyonları Hiçbir Zaman Arayın"] (http://www.artima.com/cppsource/nevercall.html). –

cevap

4

temel sınıf yapıcısı içinde fun() diyoruz here, türetilmiş sınıf vardır: Böyle yazdım çünkü ... türetilmiş sınıf yapıcısı Çağrı yapar

2

henüz oluşturulmamıştır (C++'da, ilk önce yapılandırılmış bir üst sınıf), böylece sistemde, henüz Türetilmiş bir örneği yoktur ve sonuç olarak Derived::fun() için sanal işlev tablosunda bir giriş yoktur.

Bu

genellikle özel olarak nesnenin parçası halen örneğinin oluşturulmasını ya da atalarından birinin parçası ya var sanal fonksiyonunun uygulanmasını aramak istediğiniz sürece hoş karşılanmaz kurucularınızdaki sanal fonksiyonlara çağrıları nedeni budur.

+0

Temel sınıfta sanal bir yöntem her zaman aynı imzaya sahip türetilmiş bir yöntemle, her zaman kurucuda geçersiz kılmıyor mu? – yoyo

+0

Evet, ama cevap sadece Timo tarafından verildi. –