如何继承抽象类? 我是C++新手,目前正在学习继承。我不确定如何正确继承抽象类MapItem,我一直收到这些错误。。
错误片段如何继承抽象类? 我是C++新手,目前正在学习继承。我不确定如何正确继承抽象类MapItem,我一直收到这些错误。。 ,c++,inheritance,virtual,pure-virtual,C++,Inheritance,Virtual,Pure Virtual,错误片段 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::R
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()"
它还声称我的类是一个抽象类。
只有在我将const关键字添加到tick函数时,程序才能成功编译并运行。但很明显,这是一个问题,因为tick需要对一些类成员变量进行操作。
我正确地包含了所有文件,并且我的make文件针对的是所有正确的文件,这使得我无法理解这个错误
map_item.h
// abstract class
class MapItem {
...
virtual void tick() const = 0;
}
住宅
#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
住宅
#include "residential.h"
Residential::Residential() {
capacity = 1;
taxRevenue = 0.0;
}
Residential::~Residential() {}
void Residential::tick() {
}
double Residential::collectTaxes() {
taxRevenue = 0.0;
return taxRevenue;
}
您的问题很简单,在住宅中,您声明并定义勾号如下:
void Residential::tick()
…而抽象的基础是
virtual void tick() const = 0;
您应该将常量添加到Residential::tick中,或者从Mapitem::tick中删除它,以便它们保持一致。你说
只有在我将const关键字添加到tick函数时,程序才能成功编译并运行。这是一个问题,因为tick需要对一些类成员变量进行操作
…所以听起来你想做的就是移除它
将覆盖添加到Residential::tick也是一个好主意,这样编译器就有义务验证它是否与MapItem::tick匹配:
声明成员方法会导致函数声明,该声明将隐式this指针作为第一个参数 因此,如果方法void Residential::tick末尾没有常量,则会生成类似void Residential::tickResidential*的函数 现在,在void Residential::tick const末尾添加const可以理解为带有const this指针的声明:
void Residential::tick(const Residential* this)
所以,当您在基类中声明void Residential::tick const,然后在派生类中声明void Residential::tick时,函数签名不匹配,编译器会抛出一个错误
因此,请决定您需要哪种签名(const-qualified/non-const),并确保两个签名都匹配。感谢您的回复,这是一个HW分配,该分配要求MapItem::tick是一个纯虚拟函数,据我所知,需要const=0;在类定义中。。。这也是我不太确定的。。。住宅::tick不能是常量函数,因为它需要对某些类成员进行操作。再次,我是新的C++,所以我不知道该怎么做,因为我对纯虚函数的理解是错误的。但到目前为止,它需要常数=0;part@infetsor:纯虚拟只是指它是虚拟的,并且具有=0。。。它不需要是常量。基本上,纯虚拟只是将函数标记为需要在派生类中重写,然后才能实例化类实例。没有理由认为它与函数的const有任何关系,它也没有关系。
void Residential::tick(const Residential* this)