【已解决】C++实例化抽象基类的派生类仍报错:无法实例化抽象类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_38129013/article/details/78490931

今天写了一段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。


展开阅读全文

没有更多推荐了,返回首页