[英]Question of using static_cast on “this” pointer in a derived object to base class
[英]Does a static_cast of a derived object to base always select most derived object?
在下面的人工示例中,如果我static_cast
到基類,則當我調用setSnapshot()
函數時,它仍會調用實際的對象setSnapshot()
。 這就是我要發生的事情。 我的問題是我可以一直依靠它工作嗎?
在我正在研究的代碼中,我們具有此類的層次結構,並且在b類中使用了將其靜態轉換為b類型的宏。 這是從基本類型向下轉換的,以便可以調用b中的專用功能。
#include <iostream>
class a {
};
class b: public a {
public:
virtual void setSnapshot() { std::cout << "setting b snapshot\n"; }
};
class c : public b {
public:
virtual void setSnapshot() { std::cout << "setting c snapshot\n"; }
};
int main() {
a* o = new c;
//specifically casting to b
static_cast<b*>(o)->setSnapshot(); //prints setting c snapshot - what I want to happen
delete o;
return 0;
}
標題表明您誤解了此案的內容。 new c
創建一個類型為c
的對象,它將被保留為c
直到被破壞。
如果要將其轉換為a
,則將創建一個副本。 但是yu只是投下指針 。 這不會影響原始對象。 那仍然是c
,這就是為什么您最終調用c::setSnapshot()
。
只要函數是靜態已知類型的虛函數,對它的調用將轉到最派生的重寫。
對於單繼承,這可以理解為從最派生的類開始在基類鏈上進行實現的搜索。
實際上,對於C ++,不會執行動態搜索,而是將搜索的效果實現為簡單的表查找。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.