代码:
#include <iostream>
struct A
{
void f() { std::cout << "A\n"; }
};
struct B : public A
{
void f() { std::cout << "B\n"; }
};
int main()
{
void (A::*pf)() = static_cast<void(A::*)()>(&B::f);
A* p = new B;
(p->*pf)(); // (1)
}
令人惊讶的是,行 (1)
打印了 B
,但是,它是未定义的行为,还是格式错误的代码?仅仅因为 this
和 pf
指向 B
内部,而所有静态类型指向 A
内部,它调用“错误”函数似乎非常令人惊讶。这里不应该是静态类型吗?