C ++仮想関数の解析

C ++、この機能ができるようにするキーワード仮想有する基底クラス関数宣言の元メンバー仮想関数、派生クラスのこの機能は、後続のカバレッジが遅いために、クラスを派生できるように、この修飾子の異なる実装を継承します結合効果。基本クラスのメンバ関数は、派生クラスのバージョンと呼ばれ、仮想関数を呼び出します

 

例えば、ベース・クラスは、動物が食べる仮想機能を有しています。サブクラス魚は)(食べ機能であることが本当のように見える、(このサブクラス魚とサブクラスオオカミは完全に異なっているが、あなたは動物が食べる魚の機能の下にサブカテゴリーの()の定義および使用を食べカテゴリの下の関数を参照することができます)のプロセス。

C ++

次のコードは、C ++プログラムの一例です。この例では、例外処理をコードしないことに留意すべきです。特に、新規またはベクトル::一back例外をスローし、プログラムが実行時のクラッシュやエラーの現象も可能です。

#include <iostream>
#include <vector>using namespace std;
class Animal{
public:    virtual void eat() 
const { cout << "I eat like a generic Animal." << endl; }    
virtual ~Animal() {}
}; 

class Wolf : public Animal{
public:    
void eat() 
const { cout << "I eat like a wolf!" << endl; }}; class Fish : public Animal{public:    void eat() const { cout << "I eat like a fish!" << endl; }}; class GoldFish : public Fish{public:    void eat() const { cout << "I eat like a goldfish!" << endl; }};  class OtherAnimal : public Animal{}; int main(){    std::vector<Animal*> animals;    animals.push_back( new Animal() );    animals.push_back( new Wolf() );    animals.push_back( new Fish() );    animals.push_back( new GoldFish() );    animals.push_back( new OtherAnimal() );     for( std::vector<Animal*>::const_iterator it = animals.begin();       it != animals.end(); ++it)     {        (*it)->eat();        delete *it;    }    return 0;}

以下は、仮想関数アニマル::(食べて)出力されます。

1

I eat like a generic Animal.I eat like a wolf!I eat like a fish!I eat like a goldfish!I eat like a generic Animal.

次のように動物::食べる()仮想関数は出力しないと宣言しました。

1

I eat like a generic Animal.I eat like a generic Animal.I eat like a generic Animal.I eat like a generic Animal.I eat like a generic Animal.

 

公開された352元の記事 ウォンの賞賛115 ビュー130 000 +

おすすめ

転載: blog.csdn.net/Aidam_Bo/article/details/105218344