今天对C++的编译时绑定和运行时绑定有了很大的理解,写在这里与大家共享。
先上代码:
#include<iostream>
using namespace std;
class B {
public:
void foo() { cout << "B foo " << endl; }
void pp() { cout << "B pp" << endl; }
};
int main()
{
B *somenull = nullptr;
somenull->foo();
somenull->pp();
return 0;
}
这段代码能够运行通过,并且输出:
B foo
B pp
大家对C++ 的多态肯定很熟悉,利用虚函数来实现C++的运行时绑定,可是这段代码能够运行通过,让我反思很久,翻看C++ primer,才知道这是C++ 的编译时绑定的作用。
因为对于普通的成员函数,C++在编译时就会将成员函数进行解析,且将调用的版本定下来。因此,到了运行时,由于foo()里面并没有任何需要解引用somenull指针的代码(即解引用*this),因此程序正常运行。
PS:这个问题在今年阿里的电话面试被问到,当时就回答的不是很清楚,现在仔细弄清楚了。