调用NULL对像的方法会怎样

xiaoxiao2021-02-28  114

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,程序崩溃。
转载请注明原文地址: https://www.6miu.com/read-29157.html

最新回复(0)