※ 引述《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)