我在看到C++的虚方法 的时候,怎么突然有种多此一举的感觉。比如有个基类 Class Mammal{};然后又有个派生类 Class Dog : public Mammal {};然后我弄个对象出来 Dog Fido; 按道理来说 Fido这个条狗 就能继承 Mammal这个类 public 里面的所有方法(除了Dog类里面被覆盖的)。
然后我们再来看下 虚方法这个东东。要让虚方法 virtual 起作用, 那么new 出来的 对象 必须要用其基类的指针变量来接收 ,比如: Mammal * Fido = new Dog ;等到 用 Fido来调用方法的时候 首先是先去Mammal里面找 如果找到的函数 是个虚函数,那么久忽略掉这个函数 用Dog(Dog 里面有个同名的函数) 类里面的函数。
当我看到 虚函数的这个作用的时候,我感觉 不都是继承嘛! 还搞这么多花样,在我目前的学习阶段,我主观上没发现该虚方法有什么好处。 大家来谈谈看撒!
天蓬老师2017-04-17 14:37:06
仮想関数はポリモーフィズムに使用されます。たとえば、ゲームでは、すべてのプレイヤーと敵が同じゲーム キャラクター クラスを継承でき、その内部更新関数とレンダリング関数は仮想関数です。基本クラス ポインターの配列を使用して、これらのさまざまなプレイヤーや敵を保存すると、更新とレンダリングのときに for ループのみが必要になり、労力を大幅に節約できます。
巴扎黑2017-04-17 14:37:06
次のシナリオを想像してください。TextEditor
、Button
などの多くのコンポーネントを含む UI ライブラリがあり、これらはすべて UIBase
を基本クラスとして使用します。すべてのコンポーネントを走査し、タイプ
のすべてのコンポーネント Button
を見つけたい
まず、仮想メソッド
を UIBase
に追加します (この例では、実際には純粋な仮想メソッドを追加する方が適切です)。次に、各サブクラスを追加します。すべて char* GetType()
を書き換えます。たとえば、GetType()
クラスは Button
char* GetType(){return "Button";}
として書き換えられます。
を維持し、新しい要素を作成するたびにそれを追加するだけで済みます。その後、ニーズに戻ります。 UIBase *a[]
for(k in a) if(k->GetType()=="Button"){...}
を実行します
大家讲道理2017-04-17 14:37:06
C 仮想関数: ポリモーフィズムの実装の重要な部分。 多態性? -> 最高レベルのコード再利用、エンジニアリングの重要性が未来を呼びます。
C にはインターフェースがありません。どのように実装すればよいですか? 純粋な仮想関数インターフェイス クラス。
仮想破壊、インターフェースのカプセル化と設計。
原則: 動的連鎖
PHP中文网2017-04-17 14:37:06
例:
たとえば、哺乳類と犬の両方が仮想関数 virtual void do() を定義しているとします。この時点で、関数
を定義します。 リーリーこの時点で、パラメータは哺乳類または犬のオブジェクト ポインタで渡すことができます。前のコードで示したように、ani ポインターが指すオブジェクトの実際の型は Dog であるため、ani->do() を呼び出すと、do は仮想メソッドであるため、Dog::do() が呼び出されます。
しかし、do が仮想メソッドではない場合、ani->do() は実際に Mammal::do();
を実行します。巴扎黑2017-04-17 14:37:06
これらについては、「C オブジェクト モデルの詳細な探索」という書籍にさらに詳しく説明されています。
仮想関数には実行時のバインディングが含まれますが、非仮想関数にはコンパイル時のバインディングが含まれます。
例を挙げてみましょう。