重載と多形の問題
----------------------------------------以下は『スーパー猛料』から
ここには初心者がよく混同する概念があります。オーバーレイとオーバーロード。カバーとは、親の虚関数をサブクラスで再定義する方法です。重ロードとは、同じ名前の関数が複数存在することを許可することであり、これらの関数のパラメータテーブルが異なる(あるいはパラメータの数が異なるか、あるいはパラメータの種類が異なるか、あるいは両方が異なるかもしれない)ことを意味する。実際には、リロードの概念は「オブジェクト指向プログラミング」ではなく、リロードの実現は、コンパイラが関数によって異なるパラメータテーブルによって、同じ名前の関数の名前を修飾し、これらの同名関数は異なる関数になります。例えば、同じ名前の関数が二つあります。function func(p:integer):integer;とfunction func(p:string):integer;コンパイラで修飾した関数名は、このようなものかもしれません。func、strfuncこれらの2つの関数の呼び出しについては、コンパイラ間で決定されました。つまり、それらのアドレスはコンパイル期間にバインディングされています。したがって、リロードと多状態は関係ありません。
本当に多状態と関連しているのは「覆い」です。親の種類の虚数関数を再定義した場合、父の種類のポインタは、与えられた異なるサブクラスのポインタに基づいて、動的(覚えています。ダイナミックです。)の呼び出しは、サブクラスの関数です。このような関数は、コンパイル中には特定できません。したがって、このような関数アドレスは、実行中にバインディングされています。
重い荷物は言語の特性だけで、多形とは関係なく、対象に向かっても関係ありません。 Bruce Eckelの話を引用します。「馬鹿にしないでください。もし遅く国が決めたのではないなら、多形ではないです。」 では、多形の役割は何ですか?パッケージは実装の詳細を隠してコードモジュール化できることを知っています。既存のコードモジュール(クラス)を引継ぎ拡張できます。それらの目的は全部コードの再利用です。多態は、もう一つの目的を実現するために、インターフェースを再利用することである。----------------------------------------------------------------------------------------------------------------A methodod can be redeclared using the overload directive.In this case,if the redeclard methhas a different parameter signature ffftototor,it overloads theinheheheited methododwithththoudidididididiinininininttttttttchchchchchchchchchchchchchchchcheeeeeedededededededestststststststststststststststststststststststststststststststststststststststststststststststststststststststststststあなたのoverload a virtual method、use the reintroduce directive when you redeclare it in descendant clases.For example,
タイプ
Maintensance 保存先 runtime タイプ information requires a. unique name for each published メンバー
タイプ
サブクラスでは、親の中では説明できない方法があるかもしれません。つまり、子類は方法の数で親類を広げています。したがって、どのクラスも一つのメモリ構造に対応しているので、親類のポインタをサブクラスのメモリ構造に向けると、このような指向が最後に親類に対応するサブクラスの方法を見つけることができることを確保することができる。逆に、上に述べたその原因によって、親類の中にサブクラスのすべての申明の方法が見つかることは保証できません。サブクラスが拡張された可能性がありますが、拡張された部分は親類のメモリ構造には存在しません。したがって、下に引用するのは安全ではなく、異常が発生する可能性があります。
カバーは多态を実现できるというわけではなく、カバーは多态を実现するだけのものです。多形はただ一つの特性ですが、特性も一定の方式で実現されたものです。カバーはこのような方式です。カバーとは、実際には、ある指示字でDelphiのコンパイラに教えています。今見ているこの方法は、サブクラスにおいて拡張されています。また、このような拡張は、上へ引用することによって直接に入手できます。----------------------------------------------------------------------------------------------
参照先
http://faq.csdn.net/read/175741.html
問題内容:重載と多形問題!討論を歓迎します
元の討論リンク:http://community.csdn.net/expert/topicview1.asp?id=2064895
ここには初心者がよく混同する概念があります。オーバーレイとオーバーロード。カバーとは、親の虚関数をサブクラスで再定義する方法です。重ロードとは、同じ名前の関数が複数存在することを許可することであり、これらの関数のパラメータテーブルが異なる(あるいはパラメータの数が異なるか、あるいはパラメータの種類が異なるか、あるいは両方が異なるかもしれない)ことを意味する。実際には、リロードの概念は「オブジェクト指向プログラミング」ではなく、リロードの実現は、コンパイラが関数によって異なるパラメータテーブルによって、同じ名前の関数の名前を修飾し、これらの同名関数は異なる関数になります。例えば、同じ名前の関数が二つあります。function func(p:integer):integer;とfunction func(p:string):integer;コンパイラで修飾した関数名は、このようなものかもしれません。func、strfuncこれらの2つの関数の呼び出しについては、コンパイラ間で決定されました。つまり、それらのアドレスはコンパイル期間にバインディングされています。したがって、リロードと多状態は関係ありません。
本当に多状態と関連しているのは「覆い」です。親の種類の虚数関数を再定義した場合、父の種類のポインタは、与えられた異なるサブクラスのポインタに基づいて、動的(覚えています。ダイナミックです。)の呼び出しは、サブクラスの関数です。このような関数は、コンパイル中には特定できません。したがって、このような関数アドレスは、実行中にバインディングされています。
重い荷物は言語の特性だけで、多形とは関係なく、対象に向かっても関係ありません。 Bruce Eckelの話を引用します。「馬鹿にしないでください。もし遅く国が決めたのではないなら、多形ではないです。」 では、多形の役割は何ですか?パッケージは実装の詳細を隠してコードモジュール化できることを知っています。既存のコードモジュール(クラス)を引継ぎ拡張できます。それらの目的は全部コードの再利用です。多態は、もう一つの目的を実現するために、インターフェースを再利用することである。----------------------------------------------------------------------------------------------------------------A methodod can be redeclared using the overload directive.In this case,if the redeclard methhas a different parameter signature ffftototor,it overloads theinheheheited methododwithththoudidididididiinininininttttttttchchchchchchchchchchchchchchchcheeeeeedededededededestststststststststststststststststststststststststststststststststststststststststststststststststststststststststststあなたのoverload a virtual method、use the reintroduce directive when you redeclare it in descendant clases.For example,
タイプ
- T1 = class(TObject)
- procedure Test(I: Integer); overload; virtual;
- end;
- T2 = class(T1)
- procedure Test(S: string); reintroduce; overload;
- end;
- ...
- SomeObject := T2.Create;
- SomeObject.Test('Hello!'); // calls T2.Test
- SomeObject.Test(7); // calls T1.Test
within a. クラス あなた cannot publish multiple overloaded methods with the さとめ name. Maintensance 保存先 runtime タイプ information requires a. unique name for each published メンバー
タイプ
- TSomeClass = class
- published
- function Func(P: Integer): Integer;
- function Func(P: Boolean): Integer // error
- ...
Methods that serve as property read or write specifers cannot be overloaded------------------------------------------------上へ引用すると、もうちょっと補充します。なぜ上へ引用するのは安全ですか?反対の下に引用するのは安全ではないです。道理は簡単です。サブクラスでは、親の中では説明できない方法があるかもしれません。つまり、子類は方法の数で親類を広げています。したがって、どのクラスも一つのメモリ構造に対応しているので、親類のポインタをサブクラスのメモリ構造に向けると、このような指向が最後に親類に対応するサブクラスの方法を見つけることができることを確保することができる。逆に、上に述べたその原因によって、親類の中にサブクラスのすべての申明の方法が見つかることは保証できません。サブクラスが拡張された可能性がありますが、拡張された部分は親類のメモリ構造には存在しません。したがって、下に引用するのは安全ではなく、異常が発生する可能性があります。
カバーは多态を実现できるというわけではなく、カバーは多态を実现するだけのものです。多形はただ一つの特性ですが、特性も一定の方式で実現されたものです。カバーはこのような方式です。カバーとは、実際には、ある指示字でDelphiのコンパイラに教えています。今見ているこの方法は、サブクラスにおいて拡張されています。また、このような拡張は、上へ引用することによって直接に入手できます。----------------------------------------------------------------------------------------------
参照先
http://faq.csdn.net/read/175741.html
問題内容:重載と多形問題!討論を歓迎します
元の討論リンク:http://community.csdn.net/expert/topicview1.asp?id=2064895