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