这是我的C++程序的某些类。
ElementTerrain.h:
#ifndef ELEMENTTERRAIN_H_
#define ELEMENTTERRAIN_H_
#include <iostream>
#include <string>
using namespace std;
class ElementTerrain {
public:
virtual ~ElementTerrain(){}
virtual string getElement() const = 0;
virtual string getType() const = 0;
virtual int getStock() const = 0;
};
#endif /* ELEMENTTERRAIN_H_ */
Mine.h:
#ifndef MINE_H_
#define MINE_H_
#include "ElementTerrain.h"
using namespace std;
class Mine : public ElementTerrain{
public:
Mine();
Mine(bool, bool, int);
Mine(const Mine &);
virtual ~Mine();
string getElement(){
return "Mine";
}
string getType(){
if(this->ur == true){
return "UR";}
if(this->plu == true){
return "PLU";}
return "None";
}
int getStock() {
return stock;
}
void setStock(int stock) {
this->stock = stock;
}
bool isUr() {
return ur;
}
bool isPlu() {
return plu;
}
private :
bool ur;
bool plu;
int stock;
};
#endif /* MINE_H_ */
Mine.cpp:
#include "Mine.h"
using namespace std;
Mine::Mine() {
this->ur = false;
this->plu = false;
this->stock = 0;
}
Mine::Mine(bool ur, bool plu, int stock){
this->ur=ur;
this->plu=plu;
this->stock = stock;
}
Mine::Mine(const Mine &m){
this->ur=m.ur;
this->plu=m.plu;
this->stock = m.stock;
}
Mine::~Mine() {
// TODO Auto-generated destructor stub
}
这是我出错的文件:
#include "ElementRobot.h"
#include "Mine.h"
#include <iostream>
using namespace std;
bool ElementRobot::RecolteMine(Terrain& t, ElementRobot& r) {
if(t.plateau[x][y]->getElem() != NULL){
if(t.plateau[x][y]->getElem()->getElement() == "Mine"){
Mine *m = new Mine();
if(m.getType() == r.getType() && m.getStock()>0 && r.stock<r.cap){
m.setStock(m.getStock()-1);
t.plateau[x][y]->setElem((Mine) t.plateau[x][y]->getElem());
return true;
}
if(m.getType() == r.getType() && m.getStock()==0){
cout << "Les stocks de cette mine sont épuisés.\n" << endl;
}
if(r.stock==r.cap){
cout << "Votre robot ne peut pas porter plus de minerai.\n" << endl;
}
if(m.getType() != r.getType()){
cout << "Ce robot n'est pas adapté à cette mine.\n" << endl;
}
}}
return false;
}
我想使用复制构造函数创建
Mine
类型的对象(这里我尝试使用默认构造函数),但是它说我无法分配抽象类型Mine
的对象,即使在我的类Mine
中没有纯虚方法。我是C++的初学者,但我不理解自己的错误。我也无法在互联网上找到任何东西。 最佳答案
Mine
的成员函数的签名与基类的签名不匹配(缺少const
限定词)。因此,您尚未覆盖,但重载了,而Mine
仍然是抽象的且不可实例化。
实际上就像这样:
class Mine {
public:
// this has to be implemented by deriving classes
virtual string getElement() const = 0;
// this is a separate overload
string getElement() { ... };
};
解决方案:修复签名:
string getElement() const { ... }
// ^^^^^
等等...
C++ 11的
override
关键字将极大地帮助您-它指出没有名为getElement
的非常量合格虚拟成员函数可以覆盖。