虛擬函式能否是內聯的
阿新 • • 發佈:2019-01-24
虛擬函式用於執行時多型或晚繫結或動態繫結,行內函數用於提高程式的效率,行內函數的思想:無論行內函數什麼時間被呼叫,在編譯時,行內函數的程式碼段都可以在被替換或插入,當一些小函式在程式中被頻繁使用和呼叫時,行內函數變得十分有用。
類內部定義的所有函式(虛擬函式除外)都被隱式或自動認為是內聯的
使用類的引用或指標呼叫虛擬函式時,無論虛擬函式什麼時間被呼叫,它都不能是內聯的(因為虛擬函式的呼叫在執行時確定);但是,使用類的物件呼叫虛擬函式時,無論虛擬函式什麼時間被呼叫,它都可以是內聯的(因為在編譯時編譯器知道物件的確定型別)
#include <iostream> using namespace std; class Base { public: virtual void who() { cout << "I am Base\n"; } }; class Derived: public Base { public: void who() { cout << "I am Derived\n"; } }; int main() { // note here virtual function who() is called through // object of the class (it will be resolved at compile // time) so it can be inlined. Base b; b.who(); // Here virtual function is called through pointer, // so it cannot be inlined Base *ptr = new Derived(); ptr->who(); return 0; }