我发现C++中有一个现象就是用指针来调用非虚拟函数时,指针并不一定要指向一个合法的对象的地址。而是随便一个地址都行(当然其静态的类型为某类)。
比如:(头文件等信息我略去)
class A
{
public:
void Output(void)
{
std::cout<<"A"<<std::endl;
}
};
int main()
{
A *ptr = reinterpret_cast<A*>(0x00000022);//或为A *ptr = NULL;
ptr->Output();
return 0;
}
结果竟然是正确的输出了"A";
我又用了一个方法来测试。就是用指针指向函数局部变量的引用:
class A
{
public:
void Output(void)
{
std::cout<<"A"<<std::endl;
}
/*返回局部变量的引用*/
static A& getLocalRef()
{
A a;
return a;
}
};
int main()
{
A *ptr = &A::getLocalRef();
ptr->Output();
return 0;
}
结果同样是正确的。
我认为这归因于函数的调用方法,因为非虚拟成员函数在内部的表示与一般的函数的表示没有什么不同,仅仅是成员函数有个表示类对象的指针,而普通函数没有。在调用是编译器没有检查到底是不是真的指向一个类对象,仅仅是看类型是不是而已。
到底是什么原因我现在也不清楚,上面的仅仅是我的猜测而已。我希望大家指点指点!