2015-10-19 27 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; 

您應該添加constResidential::tick,或從Mapitem::tick刪除它,所以他們是一致的。你說...

當我將const關鍵字添加到tick()函數時,程序只能成功編譯並運行。這是一個問題,因爲tick()需要對某些類成員變量進行操作。

...所以它聽起來像去除它是你想要做的。


這也是增加overrideResidential::tick()一個好主意,所以編譯器的責任,以驗證它匹配MapItem::tick()

void Residential::tick() [const] override 
+0

感謝您的回覆,這是一個硬件分配和賦值要求MapItem :: tick()是一個純粹的vritual函數,這對我的理解需要「const = 0;」在類定義中......這也是我不太確定的東西...... Residential :: tick()不能是一個常量函數,因爲它需要對某些類成員進行操作。再次即時通訊新的C + +所以我不知道該怎麼辦 – infetsor

+0

也許我對純虛函數的理解是不正確的。但截至目前它需要const = 0;部分 – infetsor

+1

@infetsor:「純虛擬」意味着它是'虛擬'並且具有'= 0'...它不需要是'const'。基本上,純虛擬標記函數需要在派生類中重寫,然後才能實例化類實例。沒有理由應該與函數的'const'有任何關係,而不是。 –

-1

聲明函數聲明,它接受一個隱含的this指針成員方法結果作爲第一個參數。

所以一個方法void Residential::tick()(沒有常量在最後)導致像void Residential::tick(Residential* this)這樣的函數。

現在在端void Residential::tick() const添加常量然後可這個指針理解爲具有一個const聲明:

void Residential::tick(const Residential* this) 

所以,當在基類聲明void Residential::tick() const,然後在派生類聲明void Residential::tick(),所述函數簽名不匹配,編譯器會拋出錯誤。

因此,決定你需要哪個簽名(const限定/非const),並確保兩個簽名匹配。

+0

謝謝,但我並不需要第一個答案的副本。 – infetsor