1. 程式人生 > >不能例項化抽象類“錯誤的解決辦法

不能例項化抽象類“錯誤的解決辦法

這篇文章講解一個程式設計中遇到一個錯誤,那就是提示”不能例項化抽象類的錯誤“,在輸出視窗有如下的錯誤提示資訊,如下圖:

根據具體情況不同,可能涉及到的類也可能不同,但是道理是一樣的,之所以出現這樣的錯誤呢,其實是因為,你繼承的類的抽象方法沒有在繼承類中進行重寫,比如在這裡,我從CView類繼承了一個類CTrlee類,但是我沒有重寫OnDraw函式,然後就進行了對CTrlee類的使用,如下:

那麼現在我將OnDraw函式補上,並在原始檔中進行定義,在標頭檔案中,我去掉註釋,是OnDraw生效,如下圖:

在原始檔中我進行定義,如下圖:

現在我再編譯,就可以了,並且正常執行,如下:

這裡只是為了說明這麼一個道理,在實際的mfc變成過程中,我們使用mfc類嚮導新增的類的時候,會自動為我們新增基類的抽象函式(虛擬函式),並定義。只是有的時候我們手動修改程式碼的時候,可能會遇到這樣的問題,比如,如下圖,通過使用類嚮導生成的類的標頭檔案中,是這樣的,如下圖:

我們可以看見有個部分叫重寫,就是用於重寫基類的虛擬函式,但是為什麼同樣是繼承與CView,這裡除了OnDraw還有別的虛擬函式,剛才我們那個類中沒有重寫啊,其實因為這幾個虛擬函式在CView基類進行了定義。而OnDraw是一個純虛擬函式,只有宣告,沒有定義。

在重寫虛擬函式的時候,一定要記住,那就是函式的函式名以及引數,返回型別等要和被重寫的函式完全一致。否則就不能完成重寫任務,仍然會有上面的錯誤出現。

關於C++ 不能例項化抽象類:
例:
#include <iostream.h>
class Base{
public:virtual void fun()=0;
} ;
class Test:public Base{
public:virtual void fun(){cout<<"Test.fun="<<endl;}
} ;
void main(){
Base a;
Test *p;p=&a;
}
void main(){
Base a;//這句是錯誤的, 因為抽象類不能被例項化
Test *p;p=&a;//這句也是錯誤的, 不能把基類的地址賦給派生類的指標。

}
應改正為
void main(){
Base *a;
Test p;a=&p;
}