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