如何继承抽象类? 我是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)