【注意】C ++多型

C ++は、多型は、同じ名前の別の関数機能を持つ、関数呼び出しが異なる機能を実行するために、オブジェクト指向設計のアイデアの重要な特徴です。ポリモーフィックの原理は、仮想関数テーブル(仮想表)によって達成されます。ダイナミックな多型は、最終的には動的バインディングを達成するために、いくつかのスペースと効率を犠牲にします。

 

 

静的ポリモーフィズム

関数のオーバーロードは、関数呼び出しのパラメータに従ってその機能を決定するために、コンパイル時に発生する結合、静的多型です。

#include <iostream>

using namespace std; void foo(int a, int b) { cout << "foo(int a, int b)" << endl; } void foo(double a, double b) { cout << "foo(float a, float b)" << endl; } int main() { foo(1, 2); foo(1.1, 2.2); return 0; } 

 

ダイナミックな多型

動的多型は、コンパイル時に決定されず、プログラムは、基本クラスのポインタ(参照)に従って実行されるとき、オブジェクトのポイントがどのクラス仮想関数呼び出しを決定します。

 

多型を達成するための動作条件:

1.基底クラスが仮想関数を持っています。

2.派生クラスオーバーライド基本クラス仮想関数。

3.サブクラスオブジェクトを指す親ポインタは、共通のインタフェースを呼び出します。

 

形式を使用して、仮想関数:

class 类名

{

    virtual 函数声明;

};
#include <iostream>

using namespace std; class Animal { public: Animal() { cout << "Animal()" << endl; } virtual void eating() { cout << "animal is eating!" << endl; } virtual ~Animal() //虚析构,保证析构完全 { cout << "~Animal()" << endl; } }; class Dog:public Animal { public: Dog() { cout << "Dog()" << endl; } void eating() { cout << "Dog is eating!" << endl; } ~Dog() { cout << "~Dog()" <<endl; } }; int main() { Animal *ani = new Dog; ani->eating(); delete ani; return 0; } 

注意:このクラスは、仮想関数が含まれ、デストラクタは仮想デストラクタとして仮想宣言しました。〜アニマル仮想〜アニマル()()のコード場合は、次のように結果は以下のとおりです。

明らかに不完全な破壊は、完全な破壊を確実にするために、仮想デストラクタデストラクタ派生クラスを呼び出すことができます。

 

 

純粋仮想関数

純粋仮想関数が基底クラスの仮想関数の中で宣言すると、体が達成し、プラスされていない「= 0」関数プロトタイプの後に、フォーマットを使用して:

class 类名
{

    virtual 函数声明 = 0;

};

 

Javaの場合と同様に、純粋仮想関数を含むクラス1は、純粋仮想基本クラスと呼ばれ、基底クラスはまた、抽象(抽象基底クラス)と呼ばれる抽象クラスをインスタンス化することができない、パブリックインターフェイスを提供するために継承することができる、派生クラスで実装しますインタフェース。

基底クラスは純粋仮想関数を宣言した場合は2、派生クラスは、このメソッドを実装していない、派生クラスで、純粋仮想関数のまま、派生クラスの仮想基底クラスは純粋なまま。

#include <iostream>

using namespace std; class Animal { public: Animal() { cout << "Animal()" << endl; } virtual void eating() = 0; virtual ~Animal() { cout << "~Animal()" << endl; } }; class Dog:public Animal { public: Dog() { cout << "Dog()" << endl; } void eating() { cout << "Dog is eating!" << endl; } ~Dog() { cout << "~Dog()" <<endl; } }; int main() { Animal *ani = new Dog; ani->eating(); delete ani; return 0; }

おすすめ

転載: www.cnblogs.com/woniu201/p/11109609.html
おすすめ