剛剛在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++的問題 ,其實是一個道理。 明白了了嗎?各位