我如何继承我的抽象类?

时间:2015-10-19 04:04:21

标签: c++ inheritance virtual pure-virtual

我是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;
}

2 个答案:

答案 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)并确保两个签名匹配。