0

まず、私はJavaコミュニティから来ており、まだC++の学習者です。

以下のクラスをご覧ください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

2番目の図は、クラス「GameObject」のサブクラスを示しています。方法もありDisplay()ます。GameObjectクラスには5つのサブクラスがあり、それらすべてにこのDisplay()メソッドがあります。では、この表示方法GameObjectは仮想的なものですか?

Display()inGameObjectはいくつかのテキストを表示するので、抽象仮想(100%仮想)ではないと思いますGameObject.cpp

とにかく、よくわかりません。助けてください!

4

1 に答える 1

2

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
  }
};

ただし、関数を純粋仮想にするということは、それを含むクラスを抽象化し、すべての派生クラスを作成することを意味し、基本クラスのすべての純粋仮想関数をオーバーライドしないことに注意してください。

于 2013-02-25T15:50:47.503 に答える