0

次のコードブロックがあるとします。

class BaseClass
{
public:
    virtual void hello() { cout << "Hello from Base" << endl; }
};

class DerivedClass : public BaseClass
{
public:
    void hello() { cout << "Hello from Derived" << endl; }
};

int main()
{
    BaseClass base;
    DerivedClass derv;

    BaseClass* bp = &base;
    bp->hello();
    bp = &derv;
    bp->hello();
}

bpが指しているタイプは実行時にどのように決定されますか?動的にバインドされていることは理解していますが、そのメカニズムは何ですか? 通常、答えはコンパイラであるため、混乱していますが、動的であるため、この例ではそうではありません(または、私は間違っていますか?コンパイラを前もって想定していますが、bpが現在を指していることを示すものは何ですか? DerivedClass?)。私もC#から来ているので、これはCLRのないネイティブコードであるため、このアイデアは私には異質です。

4

1 に答える 1

6

が構築されると、非表示のメンバーがそのDerivedClassデータに挿入されます。そのメンバーは、と呼ばれるものを指していvtableます。vtableには、派生クラスの仮想関数実装への関数ポインターがあります。

各具象クラス(インスタンス化できるクラス)には、メモリ内のどこかに独自のvtableがあります。これらのテーブルは、仮想関数がある場合にのみ生成されます。これは、使用しないものにお金を払わないというC++のモットーの一部です。

コンパイラーはbp->hello()、を検出すると、そのvtableポインターを探すことを認識し、正しい関数を呼び出します。

于 2012-04-20T18:50:06.810 に答える