我正在研究一個簡單的C++程序,並且很難理解我得到的編譯器錯誤。這個問題是由我試圖從基類創建派生類引起的。我已經用相同的結構發佈了我的代碼,但更改了名稱。爲什麼我必須重新聲明一個繼承類的虛函數?
BaseClass.h
#ifndef BASECLASS_H
#define BASECLASS_H
class BaseClass {
public:
BaseClass(void);
virtual int method1(void) = 0;
virtual int method2(void) = 0;
virtual float method3(void) = 0;
};
#endif // BASECLASS_H
DerivedClass.h
#ifndef DERIVEDCLASS_H
#define DERIVEDCLASS_H
#include "DerivedClass.h"
class DerivedClass: public BaseClass
{
public:
DerivedClass(void);
};
#endif // DERIVEDCLASS_H
DerivedClass.cpp
#include "DerivedClass.h"
DerivedClass::DerivedClass(void)
{
}
int DerivedClass::method1(void)
{
// TODO
}
int DerivedClass::method2(void)
{
// TODO
}
float DerivedClass::method3(void)
{
// TODO
}
當學嘗試婷編譯,我得到了所有的虛方法如下錯誤:
no 'int DerivedClass::methodX()' member function declared in class 'DerivedClass'
只要我宣佈在「DerivedClass.h」,錯誤消失,因爲編譯器這些方法現在已經知道的方法。
但是,我很困惑。爲什麼有必要重新聲明DerivedClass.h中的純虛函數?當我#include DerivedClass.h時,它會自動包含BaseClass.h,因此我假定我的DerivedClass.cpp應該完全知道這些方法。我做錯了什麼嗎?
每個派生類必須覆蓋其基類的虛函數。簡單的規則。附註:當你有一個不帶參數的函數時,你不需要放棄void。 – DeiDei
@DeiDei簡單,但不完全正確 – krzaq
正確,這就是我在DerivedClass.cpp中所做的。但是,爲什麼有必要重新聲明DerivedClass.h中的函數?編譯器是否應該期待方法定義? – Izzo