動態綁定是否會與棧上的對象發生?動態綁定是否只發生在C++堆中的對象上?
例如
f()是在這兩個基地一個虛函數和派生
int main(){
Derived d1;
Based *b= new Derived();
d1.f();
b->f();
}
動態綁定是否會與棧上的對象發生?動態綁定是否只發生在C++堆中的對象上?
例如
f()是在這兩個基地一個虛函數和派生
int main(){
Derived d1;
Based *b= new Derived();
d1.f();
b->f();
}
虛擬功能既堆和棧對象。請嘗試以下操作:
#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);
}
所以你的輸出是什麼?我現在沒有編譯器。我看不到。如果輸出是「derived :: doit」,那麼這就是你的意思是動態綁定? – skydoor 2010-04-17 17:19:17
@skydoor - 輸出爲「derived :: doit」,因爲虛擬函數適用於所有對象,而不管它們在何處分配。 – 2010-04-17 22:43:53
是的。
對不起,對於簡短的回答,但你似乎知道發生了什麼,只需要一些確認,對吧?
請注意,'d1.f()'可能會靜態分派。之所以編譯器'知道'd1的類型,是爲了優化動態調度。 – 2010-04-17 16:17:36
b-> f()也可以在這裏靜態調度,因爲編譯器再次知道確切的類型,但是調用是以虛擬調度開始的,並且在編譯時確定確切的函數是一種優化。只有指針和引用是多態的,本地對象上的成員函數調用始終是靜態的。多態調用使用v-table綁定,這與動態綁定不同。 – 2010-04-17 17:04:04