2

オブジェクト ポインターをその基底クラスにキャストすると、メモリは正確にどうなるのだろうといつも思っていました。サブクラスのすべてのメンバー関数と変数を格納するメモリはまだそこにあり、現在は「立ち入り禁止」になっていると思います。これは正しいですか?もしそうなら、抽象/仮想関数はどのように機能しますか? この場合、サブクラスの実装を基本クラスのポインターから呼び出すことができるのはなぜですか?

また、言語によって違いますか?明らかに、C++ はスタックとヒープを使用しますが、Java はヒープのみを使用します。これは、ポリモーフィックな関係のメモリが異なる方法で処理されることを意味しますか?

そして、これに関連して、プライベート、プロテクト、さらには仮想継承などはどのように機能するのでしょうか?

4

2 に答える 2

5

あなたが求めているのは、実装の詳細です。
大まかに言えば、通常のアプローチは、オブジェクトの一部として関数ポインタのテーブルへのポインタを格納することです(関数は実際のオブジェクトのメモリフットプリントの一部ではありません)。具体的なオブジェクトに応じて、このテーブル( C ++のvtable、いくつかの同様の構造私が想像するところ)はJava実際のランタイムオブジェクトのメソッドを指しており、その結果、基本クラスへのポインタを使用しているという事実は、派生クラスによってオーバーライドされたメソッドを実際に呼び出すことには影響しません。

そして、これに関連して、プライベート、保護、さらには仮想継承のようなものはどのように機能しますか

これはあなたの質問とは関係ありません。修飾子(パブリック/プライベート/保護)は静的な時間構成です。つまり、コンパイラは修飾子に従って使用を強制します。基礎となる記憶はここでは無関係です。

于 2012-10-21T17:11:51.293 に答える
4

通常、メモリには何も起こりません。キャストは、ポインターを使用するプログラム内の他のユーザーによるポインターの使用方法に影響を与えるだけです。

これがどのように実装されるかについての詳細は、このリンクをチェックしてください:http: //en.wikipedia.org/wiki/Virtual_method_table

于 2012-10-21T17:12:34.510 に答える