[問題] 為何static_cast會產生新物件??

看板C_and_CPP (C/C++)作者 (王大明)時間4年前 (2021/02/15 00:28), 4年前編輯推噓3(306)
留言9則, 3人參與, 4年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 問題(Question): 最近看書,不懂為何子類別static_cast成父類別 會產生一個新的暫時父類別?? 我不是很懂為何要特別產生一個新的B??用原始d1的父類別B去操作感覺也沒問題阿? 謝謝 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) https://pastebin.com/embed_js/is7CQ0p5?theme=dark #include <iostream> using namespace std; class B{ private: int b; public: B(){b = 0x1234;} virtual void set(int t){b = t;} virtual void get(){cout << "0x" << hex << b << "\n";} }; class D : public B{ private: int d; public: D(){d = 0x5678;} }; int main(){ D d1; D *ptr = &d1; static_cast<B>(*ptr).set(100);//產生一個新的B去set ptr->get(); } 補充說明(Supplement): ※ 編輯: WangDaMing (110.26.33.194 臺灣), 02/15/2021 00:30:39

02/15 00:53, 4年前 , 1F
任何轉型本來就是「轉成」目標型態的物件, 所以產生新物件
02/15 00:53, 1F

02/15 00:53, 4年前 , 2F
本來就是合理的結果; 你想要的操作可通過轉型其指標或參考
02/15 00:53, 2F

02/15 00:54, 4年前 , 3F
達成, 並且使用指標或參考也才能使用到多型的語意
02/15 00:54, 3F

02/15 10:21, 4年前 , 4F
你原來是寫 Java 嗎? 這個會牽扯到 reference semant
02/15 10:21, 4F

02/15 10:21, 4年前 , 5F
ics 還有 value semantics 的差別, 轉型在 C# 的定義
02/15 10:21, 5F

02/15 10:21, 4年前 , 6F
也不太一樣
02/15 10:21, 6F

02/17 08:38, 4年前 , 7F
正解是寫法改成 static_cast<B*>
02/17 08:38, 7F

02/17 08:41, 4年前 , 8F
跟這樣寫同理 D d = (D) b;
02/17 08:41, 8F

02/17 08:41, 4年前 , 9F
會發生copy
02/17 08:41, 9F
文章代碼(AID): #1WAK-PmD (C_and_CPP)
文章代碼(AID): #1WAK-PmD (C_and_CPP)