2013-08-16 38 views
-4

我在C++中做了一個輸出問題,我沒有得到以下問題的邏輯,任何人都可以給出一個清晰的想法。C++中的虛函數

Class Base{ 

public : 
     virtual void fun(){ 
      cout<<"Base Class public function "<<endl; 
      } 
}; 

class Derived:public Base{ 
     private: 
     void fun(){ 
      cout<<"Derived class private function "; 
      } 
}; 


int main(){ 
    Base *bp=new Derived(); 
    bp->fun(); 
} 

輸出上面的程序是: 派生類私有函數

我不能夠得到我們如何能夠調用類的私有函數。

+0

這是一個不好的練習,請參見http://www.parashift.com/c++-faq-lite/hiding-inherited-public.html –

+1

[SSCCE](http://sscce.org),請。 – jrok

+0

@IosifM。咦? 'fun'在派生類中隱式爲'virtual',OP描述動態分派的輸出(不隱藏)。無障礙不被視爲重寫。 – dyp

回答

1

讓我們來分析調用代碼

int main(){ 
    Base *bp=new Derived(); 
    bp->fun(); 
} 

在這裏,當你的代碼BP-> run()中,兩件事情發生。

1)是否好玩的是類BP物體的一部分,是公共

2)「樂趣」通話的結合。

1st,在編譯過程中發生。在檢查fun是否可調用時,編譯器只需檢查這裏是「Base」的bp類,而「fun」是Base的一部分並且是公共的。

對於第二個,因爲fun是虛擬的,所以在編譯時不會發生函數綁定。相反,編譯器會插入一些代碼,確保在運行時調用「Derived」的「fun」。