刚刚在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++的问题 ,其实是一个道理。  明白了了吗?各位