我有以下代碼(來自virtual functions and static_cast被盜):static_cast如何影響虛函數調用?
#include <iostream>
class Base
{
public:
virtual void foo() { std::cout << "Base::foo() \n"; }
};
class Derived : public Base
{
public:
virtual void foo() { std::cout << "Derived::foo() \n"; }
};
如果我有:
int main()
{
Base base;
Derived& _1 = static_cast<Derived&>(base);
_1.foo();
}
打印輸出將是:Base::foo()
但是,如果我有:
int main()
{
Base * base;
Derived* _1 = static_cast<Derived*>(base);
_1->foo();
}
打印輸出將b e:Segmentation fault: 11
老實說,我都不太明白。根據上面的例子,有人可以解釋static_cast和虛擬方法之間的複雜性嗎?順便說一句,如果我想打印輸出爲「Derived::foo()
」,我該怎麼辦?
如果您對未初始化的指針進行調用,分段錯誤實際上是最好的結果。 –
要打印輸出爲Derived :: foo(),您需要確保Derived類型的實例存在,但在任何示例中都不存在。 – mungflesh
由於您沒有任何實際的對象,因此您使用指針進行segfault。只是指針,還沒有指向任何。所以'_1-> foo()'試圖從一個隨機內存位置讀取虛擬表。如果您將指針更改爲'Base base;派生* _1 = static_cast(&base);'然後你可以嘗試調用'foo()',但你仍然應該得到'Base :: foo()',因爲那是對象。你需要一個'Derived _2; _2.foo()'。 –
John