C ++では、仮想関数は、が基本クラスまたはクラス自体で仮想として明示的に宣言されている場合にのみ仮想になります。GameObjectには基本クラスがないように見えるため、GameObject::Display()
仮想として宣言する必要があります。GameObject参照(またはポインター)を表示する場合は、その参照の背後にあるオブジェクトの実際の(つまりランタイム)タイプに従って動作する必要があります。GameObject.cppに関数本体があるからといって、その関数が純粋仮想ではないという意味ではありません(Javaの抽象に相当するC ++)。= 0
宣言にaを追加することにより、関数を純粋仮想にすることができます。それでも、純粋仮想メソッドの実装を提供できます。たとえば、メソッドを実装する派生クラスで明示的に呼び出すデフォルトの実装を作成できます。
class GameObject {
//...
public:
virtual void Display() = 0;
};
//GameObject.cpp
void GameObject::Display() {
/* do something */
}
//DerivedGO.h
class DerivedGO : public GameObject {
public:
// virtual can be left out here, since it's declared virtual in the base class
virtual void Display() {
prepDisplay(); // do some preparation
GameObject::Display(); //call the original/default implementation
}
};
ただし、関数を純粋仮想にするということは、それを含むクラスを抽象化し、すべての派生クラスを作成することを意味し、基本クラスのすべての純粋仮想関数をオーバーライドしないことに注意してください。