class A
{
public:
virtual void fun()
{
std::cout << "A fun" << std::endl;
}
};
class B : public A
{
public:
void fun()
{
std::cout << "B fun" << std::endl;
}
void foo1()
{
std::cout << a << std::endl;
}
void foo2()
{
std::cout << "" << std::endl;
}
private:
int a;
};
int main()
{
A a;
B *pb = dynamic_cast<B*>(&a);
pb->fun(); //结果1
pb->foo1(); //结果2
pb->foo2(); //结果3
return 0;
}
不必说,pb肯定为NULL了,那结果1、2、3是啥呢。跟据平时的经验,肯定是程序崩溃对吧。
运行后结果1崩溃,结果2崩溃,结果3竟然成功输出,为何?
pb为虚函数,编译器需要根据对象的虚函数指针查找虚函数表,由于对象为NULL,虚表指针也就为NULL,所以结果1崩溃。再看结果2与3,都不是虚函数,无需要虚表指针。那函数得用上吧,这好办,直结从代码段取到程序栈上就搞定了,必竟函数的代码是对象共有的。所以即使对象为NULL,也应该能调到函数。那为合结果2会失败。其实编译器会为每个函数传入一个this指针,输出a相当于this->a,this为NULL,程序崩溃。