我是c ++的新手,目前正在学习继承。我不确定如何正确继承我的抽象类MapItem
,我一直收到这些错误..
错误代码段
hidden overloaded virtual function 'MapItem::tick' declared here:
different qualifiers (const vs none)
virtual void tick() const = 0;
Undefined symbols for architecture x86_64:
"Residential::Residential()"
它还声称我的班级Residential
是一个抽象类。
当我将const
关键字添加到tick()
函数时,该程序仅成功编译并运行。但显然很安静,这是一个问题,因为tick()
需要对某些类成员变量进行操作。
我正确地包含了所有文件,我的make文件定位了所有正确的文件,这使我的理解失误。
map_item.h
// abstract class
class MapItem {
...
virtual void tick() const = 0;
}
residential.h
#ifndef RESIDENTIAL_H
#define RESIDENTIAL_H
#include "map_item.h"
class Residential : public MapItem {
private:
int capacity;
double taxRevenue;
public:
Residential();
virtual ~Residential();
void tick();
double collectTaxes();
};
#endif
residential.cpp
#include "residential.h"
Residential::Residential() {
capacity = 1;
taxRevenue = 0.0;
}
Residential::~Residential() {}
void Residential::tick() {
}
double Residential::collectTaxes() {
taxRevenue = 0.0;
return taxRevenue;
}
答案 0 :(得分:0)
您的问题只是在Residential
中声明并定义tick
,如下所示:
void Residential::tick()
......而抽象基础有......
virtual void tick() const = 0;
您应该将const
添加到Residential::tick
,或将其从Mapitem::tick
中移除,以便它们保持一致。你说......
当我将const关键字添加到tick()函数时,程序只能成功编译并运行。这是一个问题,因为tick()需要对某些类成员变量进行操作。
...所以听起来像删除它就是你想要做的事情。
将override
添加到Residential::tick()
也是一个好主意,因此编译器必须验证它是否与MapItem::tick()
匹配:
void Residential::tick() [const] override
答案 1 :(得分:-1)
声明成员方法会产生一个函数声明,该声明将隐式this指针作为第一个参数。
因此,方法GET /_active_tasks
(最后没有const)会产生类似void Residential::tick()
的函数。
现在在末尾添加const void Residential::tick(Residential* this)
可以理解为带有const this指针的声明:
void Residential::tick() const
所以,当你在基类中声明void Residential::tick(const Residential* this)
然后在派生类中声明void Residential::tick() const
时,函数签名不会匹配,编译器会抛出错误。
因此,确定您需要哪个签名(const qualified / non const)并确保两个签名匹配。