2010-04-17 12 views
1

動態綁定是否會與棧上的對象發生?動態綁定是否只發生在C++堆中的對象上?

例如

f()是在這兩個基地一個虛函數和派生

int main(){ 

    Derived d1; 
    Based *b= new Derived(); 

    d1.f(); 
    b->f(); 
} 
+0

請注意,'d1.f()'可能會靜態分派。之所以編譯器'知道'd1的類型,是爲了優化動態調度。 – 2010-04-17 16:17:36

+0

b-> f()也可以在這裏靜態調度,因爲編譯器再次知道確切的類型,但是調用是以虛擬調度開始的,並且在編譯時確定確切的函數是一種優化。只有指針和引用是多態的,本地對象上的成員函數調用始終是靜態的。多態調用使用v-table綁定,這與動態綁定不同。 – 2010-04-17 17:04:04

回答

6

虛擬功能既堆和棧對象。請嘗試以下操作:

#include <iostream> 

class base 
{ 
public: 
    virtual void doit() 
    { 
     std::cout << "base::doit" << std::endl; 
    } 
}; 

class derived : public base 
{ 
public: 
    virtual void doit() 
    { 
     std::cout << "derived::doit" << std::endl; 
    } 
}; 

void invokevirtual(base &b) 
{ 
    b.doit(); 
} 

int main() 
{ 
    derived d; 
    invokevirtual(d); 
} 
+0

所以你的輸出是什麼?我現在沒有編譯器。我看不到。如果輸出是「derived :: doit」,那麼這就是你的意思是動態綁定? – skydoor 2010-04-17 17:19:17

+0

@skydoor - 輸出爲「derived :: doit」,因爲虛擬函數適用於所有對象,而不管它們在何處分配。 – 2010-04-17 22:43:53

0

是的。

對不起,對於簡短的回答,但你似乎知道發生了什麼,只需要一些確認,對吧?

相關問題