虚関数と多状態について(良い解釈)

1152 ワード

C++:派生クラスでベースクラスを再定義するメンバー関数と虚関数の違いはどこですか?
                        ,        ,                 ,  ,              。
                  virtual,        !   ~

 
 
答え:
これは多態の問題にかかわる.たとえば、ベースクラスBASEがあり、派生クラスDerivedがBASEの2つのクラスから継承されているfunというメソッドがあり、サブクラスオブジェクトを作成しますが、親のポインタ(または参照)で彼を指します.たとえば、BASE*b=new Derived();virtualを追加しない場合、b.fun()は親クラスのfunを呼び出します.bは親ポインタであるため、親メソッドのみが呼び出され、子メソッドは呼び出されません.virtualを追加すると、b.fun()はサブクラスのfunを呼び出します.virtualを追加すると、虚表が生成されるので、fun関数を虚表に入れます.サブクラスオブジェクトを作成すると、親のfun関数が自動的に「上書き」されます(一時的に理解すればいい).b.fun()は、サブクラスオーバーライド後のfun関数を呼び出す.つまり、virtualを追加しないと、あなたのサブクラスオブジェクトにはfun関数が2つ、親クラスが1つ、サブクラスが1つあります.virtualを加えると、サブクラスにはfun関数が1つしかありません.親クラスのfun関数です.多態の役割を簡単に話しましょう.例えばATM、デビットカード、クレジットカード、VISAなど、いろいろな銀行カードを差し込みます.これらのカードはすべて銀行カードなので、銀行カードは親です.様々なカードはサブクラスです.ATMでお金を引き出すときは、カードごとに関数デビットカードを書く必要はありません.getMoney()クレジットカードgetMoney(). マルチステートができたら、銀行カードのgetMoney()関数を書くだけでいいので、virtualに設定します.マルチステートの意味は、親ポインタで子オブジェクトを指すことができることです.異なる種類のカード(サブクラス)は自分のgetMoney()を実現するだけである.銀行カードを使用してgetMoney関数を呼び出すと、プログラムは多態性のため、サブクラスのgetMoney関数を自動的に探して実行されます.とても便利です.