看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《eliang ()》之銘言: : 直接看程式碼比較快: : #include <iostream> : using namespace std; : class Parent : { : public: : Parent() { init(); } : virtual void init() { : cout << "parent init" << endl; : } : }; : class Child : public Parent : { : public: : Child() : Parent() {} : virtual void init() { : cout << "child init" << endl; : } : }; : int main() : { : Child child; : return 0; : } : 原以為輸出結果應該是 child init, 但實際跑出來是 parent init, : 以前寫 Java 常利用這一招來設計 event-handling 機制, : 沒想到在 C++ 卻沒辦法使用, : 很顯然 C++ virtual function 動態連結的方式跟我想的不一樣, : 想請問有什麼方法可以克服這個問題? 謝謝! 一個物件活著的時候有兩個階段: 1.被完整建構好儲存在記憶體中 2.所有必需資源都已經取得並且可以提供複雜的服務 ┌─────┐ │ Object │ └──┬──┘ │ ┌ ∥ ∥ 完 ∥ ∥ 整 || ┐ || 建 || 可 || 服 構 || 務 || 好 || ┘ ∥ └ ∥ │ │ 例如視窗的元件, 建構的部份由你來作, 但是能不能開始使 用要由 framework及觸發的事件來決定, 不是直接呼叫那麼 簡單, 一般的作法是使用一個介面來規範生命週期中要使用 的回呼函式: struct Initializable { virtual void init() = 0; }; 然後再讓你的 concrete class 繼承並實作之: class Parent : public Initializable { public: Parent() {} virtual void init() { cout << "parent init" << endl; } }; class Child : public Parent { public: Child() : Parent() {} virtual void init() { cout << "child init" << endl; } }; 如果你只想要單純的 C++ 物件, new Parent() 就結束了, 但是若要一個可以開始提供服務的物件, 則必須經由一連串 的函式呼叫才能達成, 當然現在沒有任何事件可以分派, 你 要自己模擬回呼的動作: struct PersonFactory { enum Type{ PARENT, CHILD }; static Initializable* get( Type type ) { Initializable *pObj = 0; pObj = (type == PARENT) ? new Parent() : new Child(); pObj->init(); return pObj; } }; 才能拿到一個可用的物件, 語言上支不支援倒不是什麼太大 問題, 重要的是架構. 通常一個 public member function 存在的目的就是要被外部所呼叫. -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢█歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (11/23 17:55)