天天看點

【已解決】C++執行個體化抽象基類的派生類仍報錯:無法執行個體化抽象類

今天寫了一段C++代碼,純粹練習寫着玩的。。。首先寫了一個包含4個純虛函數的抽象類list,之後派生了一個派生類seqList,裡面的4個虛函數都重新定義過了,下面是代碼(template<class elemType>說明是模闆類,不用管;有的函數隻是聲明一下,實作就沒有列出來)

template < class elemType > class list{ public: virtual void clear() = 0; virtual int length() const = 0; virtual void insert( int i, const elemType &x) = 0; virtual void remove( int i) = 0; };

template < class elemType > class seqList: public list< elemType >{ private: elemType *data; int currentLength; int maxSize; public: seqList( int initSize = 10); ~ seqList() { delete [] data;} void clear() { currentLength = 0;} int length() { return currentLength;} void insert( int i, const elemType &x); void remove( int i); };

主函數将seqList執行個體化為對象intSeqList

seqList< int> intSeqList;

但是編譯的時候仍然報錯:error: cannot declare variable ‘intSeqList’ to be of abstract type ‘seqList<int>’seqList<int> intSeqList;

就是說seqList仍然是抽象類

這個bug搞了我好長時間。。。想着肯定是派生類裡面沒有完全重寫抽象類裡的函數,但是怎麼找都是重寫了啊。。。

最終。。問題出在抽象類list中函數length()後面的const上,也就是說抽象類裡的length()是常量成員函數,而派生類seqList裡面length()後面沒有const就說明派生類裡面的length()不是常量成員函數,而編譯器将其看作是不同的兩個函數(雖然名字和參數類型都一樣),結果。。。編譯器就認為抽象類裡面的常量成員函數length()沒有重寫。是以派生類seqList仍然是一個抽象類,就報錯了。。

下面說一下const:在C++類裡面它可以聲明是常量對象或者常量成員函數:常量對象則隻能初始化而不能指派,且必須初始化而别不能改變常量的值;常量成員函數則告訴編譯器這個成員函數是安全的,不會改變資料成員的值,可以被常量對象所調用,常量對象隻能常量成員函數,是以和其他成員函數是不同的。特别地,如果在類定義的時候說明某個函數是常量成員函數而函數定義的時候沒有說明它是常量成員函數,那麼編譯器會把他們看作是兩個不同的函數,是重載函數,是以使用的時候一定要注意這個const。

繼續閱讀