实验内容:空指针调用成员函数(分虚和非虚讨论)的程序编译和运行情况
实验方法:编写一个类A,包含一个成员变量m_a和两个成员函数(非虚函数GetRefA和虚函数fun_v)。声明空指针分别调用虚成员函数和非虚成员函数,观察情况。
实验杰伦:1)非虚成员函数正常调用。原因是在编译器就发生了地址绑定,编译器不会给指针变量分配内存,不知道是空指针,只根据类型找到了对应的成员函数地址并绑定。
2)虚成员函数不能正常调用,尽管编译通过,但是在运行过程中没有正常运行虚函数中的函数体部分,并且程序异常退出,并没有输出第行代码的内容。
总结:空指针调用成员函数在编译阶段可以正常通过。在调用的是虚函数的时候,执行出错;调用非虚函数的时候,正常执行。
#include <iostream>
using namespace std;
class A {
public:
A() { m_a = 1; }
~A() { }
int GetRefA() {
std::cout << "GetRefA()运行" << std::endl;
return m_a;
}
virtual void fun_v() {
std::cout << "fun_v()" << std::endl;
}
int m_a;
};
int main() {
A* a = nullptr;
// 空指针调用普通成员函数,返回非静态成员
a->GetRefA();
// 空指针调用虚成员函数,无法正常运行
a->fun_v();
cout << "程序即将退出" << endl;
return 0;
}