2

vtable が実際にどのように構築されているかを調べることにしたので、デバッガーを開いて奇妙なことを発見しました。ノードptrにはいくつかの vptr が含まれています。私は常に、オブジェクトごとに 1 つの vptr しかないと考えていました。ここで何が起こっているのか誰か説明してもらえますか? (基本クラスのポインターが派生クラスのオブジェクトを指している場合)

#include <iostream>
using namespace std;

class Base
{
    int base;
public:
    virtual void say()
    {
        cout << "Hello" << endl;
    }
    virtual void no()
    {
        cout << "No" << endl;
    }
};


class Base2
{
public:
    virtual void lol()
    {
        cout << "lol" << endl;
    }
};

class Derv:public Base,public Base2
{
public:
    void say()
    {
        cout << "yep" << endl;
    }

};


int main()
{

    Base* ptr = new Derv();
    ptr->say();
    ptr = new Base();
    ptr->say();
}

ここに画像の説明を入力

4

2 に答える 2

1

ポインターを派生物にキャストしてベースへのポインターにキャストするとどうなるかを考えてみてください。ベース型と同じレイアウトを持つメモリ ブロックを参照する必要があります。複数の継承がある場合、仮想関数を持つ各ベースに 1 つの vptr が作成されます。

于 2014-05-19T20:09:54.957 に答える