検索

ホームページ  >  に質問  >  本文

关于C++的虚方法问题

我在看到C++的虚方法 的时候,怎么突然有种多此一举的感觉。比如有个基类 Class Mammal{};然后又有个派生类 Class Dog : public Mammal {};然后我弄个对象出来 Dog Fido; 按道理来说 Fido这个条狗 就能继承 Mammal这个类 public 里面的所有方法(除了Dog类里面被覆盖的)。

然后我们再来看下 虚方法这个东东。要让虚方法 virtual 起作用, 那么new 出来的 对象 必须要用其基类的指针变量来接收 ,比如: Mammal * Fido = new Dog ;等到 用 Fido来调用方法的时候 首先是先去Mammal里面找 如果找到的函数 是个虚函数,那么久忽略掉这个函数 用Dog(Dog 里面有个同名的函数) 类里面的函数。

当我看到 虚函数的这个作用的时候,我感觉 不都是继承嘛! 还搞这么多花样,在我目前的学习阶段,我主观上没发现该虚方法有什么好处。 大家来谈谈看撒!

伊谢尔伦伊谢尔伦2804日前977

全員に返信(5)返信します

  • 天蓬老师

    天蓬老师2017-04-17 14:37:06

    仮想関数はポリモーフィズムに使用されます。たとえば、ゲームでは、すべてのプレイヤーと敵が同じゲーム キャラクター クラスを継承でき、その内部更新関数とレンダリング関数は仮想関数です。基本クラス ポインターの配列を使用して、これらのさまざまなプレイヤーや敵を保存すると、更新とレンダリングのときに for ループのみが必要になり、労力を大幅に節約できます。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 14:37:06

    次のシナリオを想像してください。
    TextEditorButton などの多くのコンポーネントを含む UI ライブラリがあり、これらはすべて UIBase を基本クラスとして使用します。すべてのコンポーネントを走査し、タイプ
    のすべてのコンポーネント Button を見つけたい

    その後、仮想メソッドを使用して簡単に実現できます。

    まず、仮想メソッド
    UIBase に追加します (この例では、実際には純粋な仮想メソッドを追加する方が適切です)。次に、各サブクラスを追加します。すべて char* GetType() を書き換えます。たとえば、GetType() クラスは Buttonchar* GetType(){return "Button";} として書き換えられます。

    基本クラス ポインターを使用してサブクラス オブジェクトを保存できるため、配列

    を維持し、新しい要素を作成するたびにそれを追加するだけで済みます。その後、ニーズに戻ります。 UIBase *a[] for(k in a) if(k->GetType()=="Button"){...} を実行します

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:37:06

    C 仮想関数: ポリモーフィズムの実装の重要な部分。 多態性? -> 最高レベルのコード再利用、エンジニアリングの重要性が未来を呼びます。

    C にはインターフェースがありません。どのように実装すればよいですか? 純粋な仮想関数インターフェイス クラス。

    仮想破壊、インターフェースのカプセル化と設計。

    原則: 動的連鎖

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 14:37:06

    例:

    たとえば、哺乳類と犬の両方が仮想関数 virtual void do() を定義しているとします。この時点で、関数

    を定義します。 リーリー

    この時点で、パラメータは哺乳類または犬のオブジェクト ポインタで渡すことができます。前のコードで示したように、ani ポインターが指すオブジェクトの実際の型は Dog であるため、ani->do() を呼び出すと、do は仮想メソッドであるため、Dog::do() が呼び出されます。

    しかし、do が仮想メソッドではない場合、ani->do() は実際に Mammal::do();

    を実行します。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 14:37:06

    これらについては、「C オブジェクト モデルの詳細な探索」という書籍にさらに詳しく説明されています。
    仮想関数には実行時のバインディングが含まれますが、非仮想関数にはコンパイル時のバインディングが含まれます。
    例を挙げてみましょう。

    リーリー

    返事
    0
  • キャンセル返事