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