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

时间:2022-12-25 18:57:07
 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静态成员函数,这个很正常了