天天看点

C++ 指向空指针的对象(关于编译时绑定和运行时绑定)

今天对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:这个问题在今年阿里的电话面试被问到,当时就回答的不是很清楚,现在仔细弄清楚了。

继续阅读