私は単純な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
}
attempティンはこれをコンパイルするために、私はすべての仮想メソッドの次のエラーを取得する:コンパイラは今の認識しているので、
no 'int DerivedClass::methodX()' member function declared in class 'DerivedClass'
はできるだけ早く私は、「DerivedClass.h」でこれらのメソッドを宣言すると、エラーが離れて行きますメソッド。
しかし、私は混乱しています。 DerivedClass.hの純粋仮想関数を再宣言する必要があるのはなぜですか?私がDerivedClass.hを#includeすると、自動的にBaseClass.hがインクルードされるので、DerivedClass.cppはメソッドを完全に認識しているはずです。間違っていることをしていますか?
。単純なルール。サイドノート:パラメータを必要としない関数がある場合は、voidを入れる必要はありません。 – DeiDei
@DeiDeiシンプルですが、正確には正しくありません – krzaq
正しいです。それはDerivedClass.cppでやろうとしています。しかし、なぜDerivedClass.hの関数を再宣言する必要がありますか?コンパイラはすでにメソッド定義を期待していますか? – Izzo