1. 程式人生 > >虛擬函式能否是內聯的

虛擬函式能否是內聯的

虛擬函式用於執行時多型或晚繫結或動態繫結,行內函數用於提高程式的效率,行內函數的思想:無論行內函數什麼時間被呼叫,在編譯時,行內函數的程式碼段都可以在被替換或插入,當一些小函式在程式中被頻繁使用和呼叫時,行內函數變得十分有用。

類內部定義的所有函式(虛擬函式除外)都被隱式或自動認為是內聯的

使用類的引用或指標呼叫虛擬函式時,無論虛擬函式什麼時間被呼叫,它都不能是內聯的(因為虛擬函式的呼叫在執行時確定);但是,使用類的物件呼叫虛擬函式時,無論虛擬函式什麼時間被呼叫,它都可以是內聯的(因為在編譯時編譯器知道物件的確定型別)

#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;
}