没有被实例化的类 中的 非static成员函数竟然也可以被调用。。。前提是该成员函数没有用到成员变量

 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 #include "stdio.h"
 5 
 6 class A
 7 {
 8 public:
 9     string a;
10     void f1(){printf("Hello World\n");}
11     void f2(){a = "Hello World"; printf("%s",a.c_str());}
12     virtual void f3(){printf("Hello World");}
13     virtual void f4(){a = "Hello World";printf("%s",a.c_str());}
14 
15 public:
16     static int m_i;
17     static void f5(){cout << m_i << endl;}
18 };
19 int A::m_i = 5; //这句必须得要(如果调用了f5函数),否则会出现连接错误说f5中m_i符号找不到
20 void main()
21 {
22     A* aptr = NULL;
23     aptr->f1(); //这条代码尽然能够通过
24     //aptr->f2();
25     //aptr->f3();
26     //aptr->f4();
27     aptr->f5(); //这个能够被运行,这个很正常
28 }

在抽象类A中f1成员函数没有用到任何成员变量,因此空指向的A*指针调用f1函数能够编译连接并正常运行。

对于f2成员函数用到了成员变量,也能够编译运行,但在运行中崩溃。

对于f3成员函数,因为是虚函数,所以必须有对像,有了对象才有虚函数指针,有了虚函数指针才能够访问到虚函数,固NULL调用不到f3。

对于f4成员函数,同上。

对于f5静态成员函数,这个很正常了

原文地址:https://www.cnblogs.com/wnarutou/p/2730294.html