次のコードを実行しました。
#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
のみを表示できるはずだと思うので、これは私を驚かせました(を介してメンバー関数にアクセスするのではなく、関数アドレス自体にアクセスすると思ったからです。Base
func_ptr
_vptr
この場合に仮想ディスパッチがどのように行われるか(仮想テーブルへのアクセスがどのように行われるか)、およびこの動作がC++標準で定義されている場所(何も見つかりませんでした)を知りたいですか?