##沒有躲過的坑--抽象類不能實例化對象(但是你明明定義的不是抽象類)
今天在開發過程中遇到了一個錯誤:不能實例化抽象類
這個錯誤完全是自己疏忽大意造成的。
首先我們知道,一個類如果是抽象類,我們就不能用這個類實例化一個對象。
什么樣的類是抽象類呢??
C++沒有C Sharp中的關鍵字abstract,但是當一個類中有一個或多個純虛函數的時候,這個類就自動成為了抽象類,即不可以實例化。
純虛函數是一種特殊的虛函數,在許多情況下,在基類中不能對虛函數給出有意義的實現,而把它聲明為純虛函數,它的實現留給該基類的派生類去做。這就是純虛函數的作用。
在實際開發中,很多時候你都需要繼承別人的類,或是同事寫的類,或是一些開源庫中的類。
也許是為了追求效率,我們很難認真閱讀你要繼承的基類,或者說你只關心基類中你需要的幾個方法。
這個時候,就存在錯誤的風險。也許父類中有一個純虛函數你完全不關系,用不到,你就會大搖大擺的忽略它。
但是它不會忽略你,記住:?
**如果你的抽象類的派生類有任何一個純虛函數沒有實現,那么不管其他做的再多,這個類仍然是一個抽象類。**
所以用到你定義的子類實例化對象時候,會產生上述的錯誤。
好在編譯器能夠幫助我們,以至于可以及時改正。
所以,在繼承一個類的時候,要確保實現了所有這個基類的純虛函數。
~~~
//基類:
classA
{
public:
A();
virtual ~A();
void f1();
virtual void f2();
virtual void f3()=0;
};
//子類:
classB:publicA
{
public:
B();
virtual ~B();
void f1();
virtual void f2();
virtual void f3();
};
~~~
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常