2015-10-19 6 views
0

Я новичок в 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

Ваша проблема просто, что в 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 
+0

Спасибо за ответ, это назначение HW, и для назначения требуется, чтобы MapItem :: tick() была чистой vritual функцией, которая, как мне кажется, требует «const = 0;». в определении класса ... что-то не совсем точно о ТАКЖЕ ... Residential :: tick() не может быть постоянной функцией, потому что она должна работать с некоторыми членами класса. снова im new для C++, поэтому я не уверен, что делать здесь – infetsor

+0

Возможно, мое понимание чистой виртуальной функции неверно. но на данный момент это требует const = 0; part – infetsor

+1

@infetsor: «pure virtual» просто означает, что он «виртуальный» и имеет '= 0' ... он не должен быть' const'. В принципе, чистый виртуальный объект просто отмечает функцию как подлежащую переопределению в производном классе до того, как экземпляр класса может быть инстанцирован. Нет причин, по которым должно быть какое-либо отношение к функции 'const', а это не так. –

-1

констатирующее результатов метода состоит в объявлении функции, которая принимает неявный этот указатель как первый параметр.

Таким образом, метод void Residential::tick() (без константы в конце) приводит к такой функции, как void Residential::tick(Residential* this).

Теперь добавление Конст в конце void Residential::tick() const то можно понять, как объявление с константной этот указатель:

void Residential::tick(const Residential* this) 

так, когда Вы заявляете void Residential::tick() const в базовом классе, а затем объявить void Residential::tick() в производном классе, сигнатура функции-донота и компилятор выдает ошибку.

Итак, решите, какая подпись вам нужна (const qualified/non const) и убедитесь, что оба подписи совпадают.

+0

спасибо, но мне не нужна была копия первого ответа. – infetsor

Смежные вопросы