我如何知道在編譯時或從任何類的運行時解析函數調用?繼承中的虛擬呼叫
例如 - 在調用show()
時從派生類中,它會在運行時解析嗎?
#include <iostream>
using std::ostream;
class Base
{
public:
virtual void show() {
show(); //Call derived class 'show()'
}
};
class Derived : public Base {
public:
void show() {
show(); //Call to itself, Would this call be resolved at run-time?
}
};
ostream& operator <<(ostream &os, Base &obj)
{
obj.Base::show();
return os;
}
int main()
{
Derived D;
cout << D << endl;
}
用-S編譯成彙編列表。很容易看出虛擬調度(運行時)和普通函數調用之間的區別。 – 2011-04-05 01:42:04
@Mikael:「虛擬調度...正常函數調用」 - 如果是這些選項,從性能的角度來看真的沒什麼關係:重要的是當它是虛擬調度還是內聯。 – 2011-04-05 02:15:09
我擔心你誤解了虛擬分派:'Base :: show()'不應該調用show()...當虛擬過載可用時,不會調用它,派生類實現是直接調用的。 'Derived :: show()'不應該調用'show()' - 這將無限遞歸,直到堆棧空間耗盡。 – 2011-04-05 02:19:52