0

私がこのようなクラスを持っているとしましょう

class Base
{
    private:
        int i;
        int j;
    public:
        Base(int i)
        {
            this->i = i;
            j = 0;
        }
        Base(int i, int j)
        {
            this->i = i;
            this->j = j;
        }
        virtual void f()
        {
            cout<<"in base f()"<<endl;
        }
};

VPTRは、コンストラクターの先頭で初期化されます。ただし、この場合、デフォルトのコンストラクターはなく、パラメーター化されたコンストラクターは2つだけです。VPTRはどこで初期化されますか?

4

2 に答える 2

3

パラメータ化されたコンストラクタのみを持つクラスで、vptr(仮想ポインタ)はどこで初期化されますか?

厳密に言えば、これは完全に実装で定義されています。
ただし、ほとんどの既知のコンパイラは、vptrおよびv-tableメカニズムを介して動的ディスパッチを実装します。これらのコンパイラはすべて、各コンストラクタのメンバー初期化リスト内の独自のvテーブルを指すようにvptrを初期化します。

何かのようなもの:

Base::Base(...arbitrary params...)
   : __vptr(&Base::__vtable[0])  ← supplied by the compiler, hidden from the programmer
 {

 }

このC++FAQは、正確に何が起こるかの要点を説明しています。

于 2012-11-22T07:20:15.403 に答える
3

すべてのコンストラクターは、最初にvptr疑似フィールドを初期化します。virtualこれは、いくつかのメンバー関数を持つすべてのC++クラスの最初の隠しフィールドであると想像できます。

理論的には、仮想テーブルポインターなしで仮想関数を実装することは可能ですが、それを実行する一般的なC++実装はわかりません。

于 2012-11-22T07:18:42.547 に答える