マルチステート定義
1807 ワード
1、多態性とは何ですか.
多態性は簡単に要約できる.
「1つのインタフェース、複数のメソッド」では、プログラムが実行時に呼び出される関数を決定します.
オブジェクト向けプログラミング分野の核心概念である.
虚関数を書き換えてこそ現れる
C++
の多態性
虚関数:
虚関数は多態に対して決定的な役割を果たし,虚関数があってこそ多態を構成することができる.
1)虚関数の宣言にvirtualキーワードを付けるだけで,関数定義に加算してもよいし,加算しなくてもよい.
2)便宜上、ベースクラスの関数のみを虚関数として宣言することで、すべての派生クラスで遮蔽(上書き)関係を持つ同名の関数が自動的に虚関数になります.
3)ベースクラスに虚関数が定義されている場合、派生クラスがこの関数を隠すために新しい関数を定義していない場合、ベースクラスの虚関数が使用されます.
4)派生クラスの虚関数遮蔽ベースクラスの虚関数(関数プロトタイプが同じ)のみが多態(ベースクラスポインタによる派生クラス関数へのアクセス)を構成する.
5)コンストラクション関数は虚関数ではありません.
6)構造関数は虚関数として宣言することができ、虚関数として宣言する必要がある場合がある.
多態を構成する条件継承関係が存在しなければならない.
継承関係には、同じ名前の虚関数が必要であり、それらは遮蔽(上書き)関係である必要があります.
ベースクラスのポインタが存在し、そのポインタによって虚関数が呼び出されます.
ポインタによるアップシフトでなければならず,オブジェクトのアップシフトでは,通常のアップ賦値のみである.
通常のポインタは上向きに変換され、ベースクラスはベースクラスのメンバーメソッドを呼び出し、派生クラスのメンバー変数を使用します.
しかし,虚関数であれば,派生クラスの(虚)メンバーメソッドと派生クラスのメンバー変数を用いる.彼を上への転換と見なさないで、彼を多態と理解しなければならない.
インスタンスコード
多態性は簡単に要約できる.
「1つのインタフェース、複数のメソッド」では、プログラムが実行時に呼び出される関数を決定します.
オブジェクト向けプログラミング分野の核心概念である.
虚関数を書き換えてこそ現れる
C++
の多態性
虚関数:
虚関数は多態に対して決定的な役割を果たし,虚関数があってこそ多態を構成することができる.
1)虚関数の宣言にvirtualキーワードを付けるだけで,関数定義に加算してもよいし,加算しなくてもよい.
2)便宜上、ベースクラスの関数のみを虚関数として宣言することで、すべての派生クラスで遮蔽(上書き)関係を持つ同名の関数が自動的に虚関数になります.
3)ベースクラスに虚関数が定義されている場合、派生クラスがこの関数を隠すために新しい関数を定義していない場合、ベースクラスの虚関数が使用されます.
4)派生クラスの虚関数遮蔽ベースクラスの虚関数(関数プロトタイプが同じ)のみが多態(ベースクラスポインタによる派生クラス関数へのアクセス)を構成する.
5)コンストラクション関数は虚関数ではありません.
6)構造関数は虚関数として宣言することができ、虚関数として宣言する必要がある場合がある.
多態を構成する条件継承関係が存在しなければならない.
継承関係には、同じ名前の虚関数が必要であり、それらは遮蔽(上書き)関係である必要があります.
ベースクラスのポインタが存在し、そのポインタによって虚関数が呼び出されます.
ポインタによるアップシフトでなければならず,オブジェクトのアップシフトでは,通常のアップ賦値のみである.
通常のポインタは上向きに変換され、ベースクラスはベースクラスのメンバーメソッドを呼び出し、派生クラスのメンバー変数を使用します.
しかし,虚関数であれば,派生クラスの(虚)メンバーメソッドと派生クラスのメンバー変数を用いる.彼を上への転換と見なさないで、彼を多態と理解しなければならない.
インスタンスコード
#include
using namespace std;
// Base
class Base{
public:
virtual void func();
virtual void func(int);
};
void Base::func(){
cout << "void Base::func()" << endl;
}
void Base::func(int n){
cout << "void Base::func(int)" << endl;
}
// Derived
class Derived : public Base{
public:
void func();
void func(char *);
};
void Derived::func(){
cout << "void Derived::func()" << endl;
}
void Derived::func(char *str){
cout << "void Derived::func(char *)" << endl;
}
int main(){
Base *p = new Derived();
p->func(); // void Derived::func()
p->func(10); // void Base::func(int)
p->func("hello"); //compile error
return 0;
}
:
, , , !