调用NULL对像的方法会怎样

来源:互联网 发布:oneinstack java 编辑:程序博客网 时间:2024/05/21 11:08
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,程序崩溃。
原创粉丝点击