天天看點

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:這個問題在今年阿裡的電話面試被問到,當時就回答的不是很清楚,現在仔細弄清楚了。

繼續閱讀