C++虛析構和java的override

 剛剛在CSDN上看到了一道C++找錯題題目如下:

 

  1. [code=C/C++][/code] 
  2. class A 
  3. public
  4. A(){}    
  5. ~A(){} 
  6. }; 
  7.  
  8. class B:public A 
  9. public
  10. B(){}    
  11. ~B(){} 
  12. }; 
  13.  
  14. int main() 
  15. A *p=new B; 
  16. delete p; 
  17. p=0; 
  18. return 0; 

問題出現在哪裏?  問題是當執行delete p的時候,執行了僅僅是執行了~A{}這個函數,而沒有執行~B(){}這個函數。

解決方法是將~A{}變爲虛析構函數,virtual ~A{} 為什麼呢?

==========

我之前是學習java的 在java中如果是這種情況我之前遇到過 ,當然我執行的不是析構函數,如下:

 

  1. class A { 
  2.  public void method1(){ 
  3.  public void method2(){ 
  4.  
  5.  
  6. class B  extends A{ 
  7.  public void method1(){ 
  8. @override 
  9.  public void method2(){ 
  10.  

 

  1. A a = new B(); 
  2. a.method1(); 
  3. a.method2(); 

這個時候a.method1()執行的其實是A中的method1方法,然而a.method2()執行的確實B中的method2()方法,爲什麼呢?  因爲method2方法簽名上面加上了註解(Annotation) @override  這樣就達到重寫的效果。 其實eclipse 完全可以自動給你加上。

=====

C++                      Java

虛函數     --------   普通函數

純虛函數   --------   抽象函數

抽象類     --------   抽象類

虛基類     --------   接口

 

=========

回到上個C++的問題 ,其實是一個道理。  明白了了嗎?各位

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章