簡體   English   中英

以派生對象為基礎的static_cast是否總是選擇大多數派生對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM