2
class base {
public:
    virtual void fn(){}
};

class der : public base {};

コンパイラーは、コンストラクターによって実行時に正確な VTABLE で初期化されるクラスのメンバー呼び出し VPTR を提供することを知っています。2つの質問があります

1) VPTR を保持するクラス。またはすべてのクラスが個別の VPTR を持っています。

2) 文を実行するときder d; 、VPTR は実行時にどのように解決されますか?

4

3 に答える 3

3

vtableは、仮想関数を含むクラスとそれから派生したクラスに対して作成されます。これは、プログラム内でクラスとクラスvtableに対して作成されることを意味します。これらのそれぞれに仮想関数のアドレスが含まれます。クラスには、の定義、したがって、クラスの関数のアドレスが含まれています。したがって、uがクラスの関数のように呼び出しを行うと、実行されます。basedervtablesvoid fn()dervoid fn()vtablebasevoid fn()d.fn();void fn()base

于 2011-09-29T10:11:14.720 に答える
2

注:仮想テーブルと仮想ポインタは実装の詳細ですが、私が知っているすべてのC++コンパイラがそれらを使用していますが、それらは標準によって義務付けられておらず、結果のみです。

特定の質問に答えるには、仮想メソッド(独自のメソッドまたは継承されたメソッド)を持つクラスの各インスタンス、または(どこかで)仮想継承関係を持つクラスには、少なくとも1つの仮想ポインターが必要です。

いくつか存在する可能性があります (仮想継承または多重継承が関係している場合)。

あなたの例では、単一の仮想ポインターで十分です。ただし、それを の一部であると言うのは意味がありませんclass。仮想ポインタはインスタンス (オブジェクト) の一部であり、言語に適用されるクラス規則の外にあり、仮想ポインタは実装メカニズムです。

于 2011-09-29T08:49:21.220 に答える
0

1) VPTR を保持するクラス。またはすべてのクラスが個別の VPTR を持っています。

ポリモーフィック (つまり、関数を含むか、継承がある) の場合、すべてのclass オブジェクトには独自のオブジェクトがあります。この場合、両方のクラスに関数があります。vptrclassvirtualvirtualvirtual

2) ステートメントder d を実行するとき。VPTR は実行時にどのように解決されますか?

のオブジェクトを宣言しているだけですder。ただし、関数を呼び出したとしても、この場合、関数の呼び出しはコンパイル時に解決されます。仮想関数の解決は、関数がポインター/参照で呼び出された場合にのみ明らかになります。

于 2011-09-29T08:42:47.203 に答える