學過C++的應該都知道C++中的抽象基類,當咱們須要一個基類不能被實例化時,抽象基類就須要上場了。數組
它一般是經過定義至少一個純虛函數來實現的,例以下面就是一個抽象基類的例子:函數
class Abstract { public: Abstract(int data = 0){ m_data = data; }; virtual int getdata() = 0; private: int m_data; };
這時我想要定義一個Abstract的實例,如spa
int _tmain(int argc, _TCHAR* argv[]) { Abstract a; return 0; }
編譯就會出錯,提示指針
error C2259: 「Abstract」: 不能實例化抽象類
1> 因爲下列成員:
1> 「int Abstract::getdata(void)」: 是抽象的code
這就是抽象基類的做用,可以被繼承,可是不能被直接實例化。對象
若是我想要實例化抽象基類,怎麼辦?其實仍是有辦法的。blog
好比我以下例般定義一個抽象類的數組並初始化繼承
int _tmain(int argc, _TCHAR* argv[]) { Abstract arr[1] = {3}; return 0; }
進行編譯,槓槓的,木有任何問題!get
我想用抽象類來調用純虛函數?也木有任何問題,實際上,C++是容許純虛函數有定義的。這樣咱們能夠把代碼改爲以下這樣。編譯
class Abstract { public: Abstract(int data = 0){ m_data = data; }; virtual int getdata() = 0; private: int m_data; }; int Abstract::getdata(){ return m_data; } int _tmain(int argc, _TCHAR* argv[]) { Abstract arr[1] = {3}; cout<<arr[0].getdata()<<endl; return 0; }
運行,能夠看到結果是3!這正是咱們想要的!
可是雖然上述方法能成功,可是若是想用定義好的抽象類直接初始化抽象類仍是會出錯
Abstract arr[1] = {3}; Abstract a = arr[0];
編譯會出錯。
用指針或引用來指向對象則能夠編譯成功
Abstract arr[1] = {3}; Abstract* a = &arr[0];
可是若是用指針或引用調用純虛函數則運行時會出錯
cout<<a->getdata()<<endl;
若是用指針或引用調用非純虛函數,則能成功運行!
注:本實驗在VS2008專業版下進行,不一樣的環境,結果也可能不一樣。