【问题标题】:how do i inherit my abstract class?我如何继承我的抽象类?
【发布时间】:2016-01-17 07:55:33
【问题描述】:

我是 C++ 新手,目前正在学习继承。我不确定如何正确继承我的抽象类MapItem,我不断收到这些错误..

错误sn-p

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

住宅.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

住宅.cpp

#include "residential.h"

Residential::Residential() {
    capacity = 1;
    taxRevenue = 0.0;
}

Residential::~Residential() {}

void Residential::tick() {
}

double Residential::collectTaxes() {
    taxRevenue = 0.0;
    return taxRevenue;
}

【问题讨论】:

    标签: c++ inheritance virtual pure-virtual


    【解决方案1】:

    您的问题只是在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
    

    【讨论】:

    • 感谢您的回复,这是一个硬件任务,任务要求 MapItem::tick() 是一个纯虚拟函数,据我所知需要“const = 0;”在类定义中...我不太确定 ALSO ... Residential::tick() 不能是常量函数,因为它需要对某些类成员进行操作。我又是 C++ 新手,所以我不知道在这里做什么
    • 也许我对纯虚函数的理解是不正确的。但截至目前,它需要 const = 0;部分
    • @infetsor:“纯虚拟”只是意味着它是 virtual 并且具有 = 0... 它不需要是 const。基本上,纯虚函数只是将函数标记为需要在派生类中重写,然后才能实例化类实例。没有理由应该与函数的const有任何关系,而它没有。
    【解决方案2】:

    声明成员方法会导致函数声明将隐式 this 指针作为第一个参数。

    因此,void Residential::tick() 方法(末尾没有 const)会产生类似 void Residential::tick(Residential* this) 的函数。

    现在在void Residential::tick() const末尾添加const可以理解为一个带有const this指针的声明:

    void Residential::tick(const Residential* this)
    

    所以,当你在基类中声明void Residential::tick() const,然后在派生类中声明void Residential::tick(),函数签名不匹配,编译器会抛出错误。

    所以,决定你需要哪个签名(constqualified/non const)并确保两个签名匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2021-07-25
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多