2011-07-21 145 views
1

如何保持派生對象的基指針仍指向基函數? 這裏後基指針中的派生對象如何調用基函數?

a_ptr = &b_obj; 
a_ptr->disp(); 

如果基本功能已經虛擬我明白V-表,其中包含地址立足function.But這裏的基指針hodling派生類對象可以管理調用基函數的參與。

任何人都可以拋出一些背景幕後發生的事情嗎?

class A 
{ 
public: 
//virtual void disp() 
void disp() 
{ cout<< "From class A\n" << endl; } 
}; 

class B : public A 
{ 
public: 
void disp() 
{ cout << "From Class B\n" <<endl; } 
}; 

int main() 
{ 
A a_obj; 
A *a_ptr; 

B b_obj; 

a_ptr = &a_obj; 
a_ptr->disp(); 

a_ptr = &b_obj; 
a_ptr->disp(); 
} 

回答

5

基地指針總是指向衍生對象的基座部分。它不知道關於派生對象成員/方法的任何信息。

如果您聲明方法A::disp()virtual,那麼只有它會在運行時解析。它可能會根據a_ptr指向A::disp()B::disp()指向。

簡單地說,

  1. 如果你聲明的方法virtual然後編譯器知道這個 方法在運行時進行評估。此外,該方法必須使用指針或引用來調用。
  2. 如果使用對象調用方法或者如果方法不是 virtual那麼編譯器立即將調用的方法調用爲調用方的靜態類型 。

在你的情況下,調用者的靜態類型是A*而方法不是virtual。因此,編譯器馬上撥打電話A::disp();它不會等待運行時評估。

a_ptr = &b_obj; // static type --> typeof(*a_ptr) --> A 
       // dynamic type --> typeof(b_obj) --> B 
a_ptr->disp(); // (is A::disp() virtual)? 
       // chooses B::disp() at runtime : chooses A::disp() at compiletime; 

[注:假設,如果你只作B::disp()作爲virtual並保持A::disp()正常的方法是,那麼你仍然會得到相同的結果,你現在得到]

相關問題