10

次のコードを実行しました。

#include <iostream>

class Base
{
public:
    virtual void func()
    {
        std::cout<<"Base func called"<<std::endl;
    }
};

class Derived: public Base
{
public:
    virtual void func()  override
    {
        std::cout<<"Derived func called"<<std::endl;
    }
};

int main()
{
    void (Base::*func_ptr)()=&Base::func; //Yes, the syntax is very beautiful.
    Base* bptr=new Derived();
    (bptr->*func_ptr)();
}

私の予想される出力はBase func called. ただし、代わりに、出力は

Derived func called

メンバーfunc_ptrのみを表示できるはずだと思うので、これは私を驚かせました(を介してメンバー関数にアクセスするのではなく、関数アドレス自体にアクセスすると思ったからです。Basefunc_ptr_vptr

この場合に仮想ディスパッチがどのように行われるか(仮想テーブルへのアクセスがどのように行われるか)、およびこの動作がC++標準で定義されている場所(何も見つかりませんでした)を知りたいですか?

4

2 に答える 2