我在基于抽象父类实现类时遇到了一些问题。它说PolishStack是一个抽象类,即使所有虚函数都是编码的:
In file included from braincalc.cpp:10:
./polstack.h:15:7: error: explicit specialization of non-template class 'PolishStack'
class PolishStack<T> : public AbstractStack<T> {
^ ~~~
braincalc.cpp:13:21: error: variable type 'PolishStack<char>' is an abstract class
PolishStack <char> stk;
^
./abstractstack.h:53:16: note: unimplemented pure virtual method 'isEmpty' in
'PolishStack'
virtual bool isEmpty() const = 0;
这是我的班级标题:
#ifndef POLSTACK_H
#define POLSTACK_H
#include <iostream>
using namespace std;
#include "abstractstack.h"
template <typename T>
class PolishStack<T> : public AbstractStack<T> {
T* data;
int mMax;
int mTop;
public:
PolishStack();
bool isEmpty();
const T& top() const throw (Oops);
void push(const T& x);
void pop();
void clear();
//my funcs:
void printStack();
~PolishStack();
};
#endif
由于其他学生作弊,我不想放弃所有代码,所以我会发布错误抱怨的功能:
#include "polstack.h"
//...
template <typename T>
bool PolishStack<T>::isEmpty() {
if(mTop == 0)
return true;
return false;
}
//...
答案 0 :(得分:3)
正如其他人所说的应该是:
template<typename T>
class PolishStack : public AbstractStack<T>
./ abstractstack.h:53:16:注意:未实现的纯虚方法'isEmpty' 'PolishStack'
virtual bool isEmpty()const = 0;
您错过了const
:
template<typename T>
bool PolishStack<T>::isEmpty() const
// ^^^^^
{
if(mTop == 0)
return true;
return false;
}
注意:当您尝试使用不同的签名覆盖函数时,应该使用override
关键字(即,您引入了新的函数重载而不是覆盖virtual
一个。)
template<typename T>
class PolishStack : public AbstractStack<T>
{
public:
...
bool isEmpty() const override;
...
};
答案 1 :(得分:0)
尝试更改为
template <typename T>
class PolishStack : public AbstractStack<T>
作为旁注:不推荐使用异常说明符throw (Oops)
。
答案 2 :(得分:0)
没有所有代码很难说,但我注意到的一点是:
class PolishStack<T> : public AbstractStack<T> {
应该只是:
class PolishStack : public AbstractStack<T> {
这将确定第一个错误肯定而且可能(但可能不是)第二个。