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静态成员函数,这个很正常了