Re: [問題] 一個設計上的問題(virtual function)

看板C_and_CPP作者 (阿貓)時間12年前 (2012/12/15 13:54), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《rabbit0321 (fish)》之銘言: : 我在程式中宣告了一個 base class 的 pointer object,礙於有時候我想用該 object 去 : call subclass 專屬的 funciton 時要強制轉型才能達成(如以下ex),這會造成我的程 : 式碼又長又醜(若命名長一點的話...) : ex. RD 與 PM 繼承 Employee : Employee* A; : (RD*)A->get_RD(); : (PM*)A->get_PM(); : 所以我想把該 function 變成 virtual 去實做,但是又遇到以下幾個問題...... : 我在 base class 設定一個 pure virtual funciton,但是這個 function 並不是所有的 : sub class 都會實做到,如果該 pure virtual funciton 沒有被底下每一個 : sub class 實做到的時候,沒實做到該 funciton 的 sub class 在 compile 時會出現 : error: cannot allocate an object of abstract type...... : 又,如果我不將該 virtual funciton 設成 pure,那麼在 base class 就必須實作它, : 可是這樣就會違背原本設計想法的意義(該 function 明明就是只有 sub class 才用得 : 到,為什麼一定要我在 base class 中去實做它),如果實做了裡面不做事還 ok,但是 : 遇到那種 get data 類型的 function,必須回傳一個東西,我又不知道該怎麼辦才好了 : ...... : 是否最前者就是比較好的方法了呢? : 又或者有沒有其他更好的設計? : 謝謝大家!!! 這個叫做Liskov Substitution Principle、"圓形-橢圓形問題"或是"正方形-長方形問題" struct base { virtual ~base() = default; virtual int foo() const = 0; }; struct derived : base { virtual int foo() const override { // don't want to return an int. } }; OOP常講public inheritance是一種"is-a"(是一個)的概念, 這裡宣告了一個base,而且宣告當你有一個base物件, 然後你call它的foo method的時候,它會return一個int回來, 再來derived繼承了base(dervied是一個base),所以當你有一個dervied物件, 你call它的foo method也應該要return一個int, 要不然你說他是一個base,但是它又和base的行為不一樣,那你怎麼能說他是一個base呢? 至於要怎麼解決這個問題,這要看你的情況,以上面的例子舉例來說, 那我就改宣告base的foo method"可能"會return一個int,像這樣: struct base { virtual ~base() = default; // or int*, std::tuple<int, bool>, boost::variant<int, nothing>... virtual boost::optional<int> foo() const = 0; }; struct derived : base { virtual boost::optional<int> foo() const override { // don't want to return an int. return {}; } }; std::unique_ptr<base> b = new derived{}; const auto r = b->foo(); if (r) { // use *r if foo() returns an integer } else { // foo() returns nothing } 不過我猜你的問題可能是parent包含了太多的功能, 例如你的employee可能有a和b兩種功能,但是你的rd只需要a的功能, 這時候你rd如果derive empolyee就會發生問題, 這種情況下你可以試著把a和b拆開來,然後讓原本employee的subclasses去繼承需要的部份 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.235.102 ※ 編輯: PkmX 來自: 140.113.235.102 (12/15 21:54) ※ 編輯: PkmX 來自: 140.113.235.102 (12/15 22:14)

12/16 20:59, , 1F
大神只能拜惹<(_ _)>
12/16 20:59, 1F
文章代碼(AID): #1Gp84Y1X (C_and_CPP)
文章代碼(AID): #1Gp84Y1X (C_and_CPP)