我执行了以下代码。
#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++ 标准中定义的位置(我什么都找不到)?