[心得] 多型二三事

看板C_and_CPP (C/C++)作者 (小乖)時間16年前 (2010/04/22 10:22), 編輯推噓4(407)
留言11則, 5人參與, 最新討論串1/1
最近在研究 MFC 的 Serialization (序列化、線性化) 機制, 發現我對多型 (polymorphism) 的理解仍然是模模糊糊的~ 我把我遇到的問題與想法整理一下給大家參考 一般對多型就會想到畫圖的例子 eq. class Shape{ virtual void draw() = 0; } class Rectangle : public Shape{ virtual void draw() { // draw Rectangle } } class Circle : public Shape{ virtual void draw() { // draw Circle } } 使用方式: vector<Shape*> vec_shape; vec_shape.push_back(new Rectangle()); vec_shape.push_back(new Circle()); Iterator it = vec_shape.begin(); for(;it!=vec_shape.end();++it) it->draw(); // "直接"呼叫 virtual function 考慮下面的 code eq. class Doc{ public: void func(){ cout << "[func] call ==> " ; serial(); } private: virtual void serial(){ cout << "serial: Doc" << endl; } }; class Txt : public Doc{ private: virtual void serial(){ cout << "serial: Txt" << endl; } }; Doc* d = new Txt(); d->func(); *[32m// "間接"呼叫 virtual function *[m 這上述兩行我想了好一會兒,因為我對多型的思考還局限於"畫圖" 那樣的直接呼叫 virtual fucntion , 而 d->func() 它是呼叫 non-virtual 的 Doc::func(),而 func 內部的 serial 卻是呼叫 Txt::serial()。 這樣的呼叫方式令人有點眼花撩亂、撲朔迷離~ 果然不負"多型"這兩個字 XD (MFC 中的 serialization 機制就有利用到這樣的多型方式) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.176.69

04/22 12:39, , 1F
推...好就不見...變C++高手了XD
04/22 12:39, 1F

04/22 12:54, , 2F
倒數第四行的 static 應該是 non-virtual
04/22 12:54, 2F

04/22 12:55, , 3F
這看起來像是 template method
04/22 12:55, 3F

04/22 12:56, , 4F
你可以參考一下 Design Patterns 這本書
04/22 12:56, 4F

04/22 13:35, , 5F
你不覺得這樣可以讓 implementor 乾淨點嗎? :P
04/22 13:35, 5F

04/22 14:57, , 6F
這就是template method,另外effective c++裡的item35也有
04/22 14:57, 6F

04/22 14:57, , 7F
提到
04/22 14:57, 7F
※ 編輯: spider391 來自: 61.216.174.197 (04/22 15:57)

04/22 15:59, , 8F
template method 這個 pattern 有看過,但沒有 sense
04/22 15:59, 8F

04/22 16:00, , 9F
現在看應該會比較有感覺~ 謝了^^
04/22 16:00, 9F
※ 編輯: spider391 來自: 61.216.174.197 (04/22 16:01)

04/22 16:03, , 10F
倒數第四行的 static 本來是想解釋這是靜態 binding
04/22 16:03, 10F

04/22 16:04, , 11F
忘了考慮 static 修飾字的情況了 謝謝指教^^
04/22 16:04, 11F
文章代碼(AID): #1BpxBxFg (C_and_CPP)
文章代碼(AID): #1BpxBxFg (C_and_CPP)