A a;
B *ptr = (B *)&a; // 強制將基類物件指標轉為派生類指標
ptr->foo(); // 非虛函數:靜態綁定,呼叫 B::foo() -> 輸出 3
ptr->fun(); // 虛函數:動態綁定,但 vptr 指向 A 的虛表 -> 呼叫 A::fun() -> 輸出 2
ptr->testB(); // 派生類專有函數:極度危險,存取不存在的成員 -> 未定義行為
B*)決定呼叫 B::foo(),即使物件實為 A。A)查虛表,呼叫 A::fun()。testB()、資料成員 B 獨有的欄位在 A 物件中不存在,讀寫會導致記憶體破壞、崩潰或無聲錯誤。C++ 強制轉型((B*))告訴編譯器「我相信你知道我在做什麼」,編譯器不做執行期檢查。這是 C++「信任程式設計師」哲學的體現,也是坑的來源。
A* ptr = new B();),配合虛函數實現多態。dynamic_cast<B*>(ptr)(需 RTTI 且基類有虛函數),失敗回傳 nullptr。警告:將基類物件強轉為派生類指標屬於未定義行為,輕則輸出錯誤,重則隨機崩潰,嚴禁用於生產代碼。