刚刚在CSDN上看到了一道C++找错题题目如下:
- [code=C/C++][/code]
- class A
- {
- public:
- A(){}
- ~A(){}
- };
- class B:public A
- {
- public:
- B(){}
- ~B(){}
- };
- int main()
- {
- A *p=new B;
- delete p;
- p=0;
- return 0;
- }
问题出现在哪里? 问题是当执行delete p的时候,执行了仅仅是执行了~A{}这个函数,而没有执行~B(){}这个函数。
解决方法是将~A{}变为虚析构函数,virtual ~A{} 為什麼呢?
==========
我之前是学习java的 在java中如果是这种情况我之前遇到过 ,当然我执行的不是析构函数,如下:
- class A {
- public void method1(){
- }
- public void method2(){
- }
- }
- class B extends A{
- public void method1(){
- }
- @override
- public void method2(){
- }
- }
- A a = new B();
- a.method1();
- a.method2();
这个时候a.method1()执行的其实是A中的method1方法,然而a.method2()执行的确实B中的method2()方法,为什么呢? 因为method2方法签名上面加上了注解(Annotation) @override 这样就达到重写的效果。 其实eclipse 完全可以自动给你加上。
=====
C++ Java
虚函数 -------- 普通函数
纯虚函数 -------- 抽象函数
抽象类 -------- 抽象类
虚基类 -------- 接口
=========
回到上个C++的问题 ,其实是一个道理。 明白了了吗?各位