iT邦幫忙

2025 iThome 鐵人賽

DAY 15
1
Software Development

30 天 Effective C++ 大挑戰!!系列 第 15

[Day 15] Inheritance and Object-Oriented Design II

  • 分享至 

  • xImage
  •  

又是忙碌且充實的一天,幸好現在是星期五晚上。轉眼間鐵人賽挑戰時程已然過半,在享受愉快的週末前,先繼續來點物件導向當佐料吧!

35. Consider alternatives to virtual functions

如同知識點 7 提到的,設計類別階層時通常會用 virtual 函式解決多型問題。但其實有其他替代的做法。

  • Non-Virtual Interface (NVI):將公共介面設為虛擬函式,具體行為則用私有虛擬函式實現。此設計能增加封裝性,先執行必要的前後置檢查,再由子類別完成實際邏輯。
  • Strategy Pattern:不再使用 function pointer,而是以 std::function 代表不同的計算策略。此模式將行為與類別解耦,允許同一類別使用不同方式。
  • Class Strategy Pattern:使用類別來表示不同的計算邏輯,並以指標的方式傳遞給目標類別。這樣可以將計算邏輯封裝在不同的子類別中,實現更加清晰和可擴展的設計。

36. Never redefine an inherited non-virtual function

非虛擬函式在繼承中若被重新定義,行為會依指向的指標類型改變。以知識點 32Student 為例:

class Student {
public:
    int age;
    string school;
    string thesis;
    void score();
};

衍生類別 Yoyo 繼承自 Student,卻重複定義了 score() 函式:

class Yoyo : public Student {
public:
    int salary;
    void score();
};

這時若呼叫 score() 可能會有兩種行為,這種不一致讓程式難以預測:

Student student;
Yoyo* yoyo_ptr = &student;
yoyo_ptr->score();  // Yoyo::score()

Student* student_ptr = &student;
student_ptr->score();  // Student::score()

最好的做法是避免重新定義父類的非虛擬函式。若需要子類自訂行為,應使用虛擬函式或 NVI。

37. Never redefine a function's inherited default parameter value

虛擬函式的動態綁定與預設參數的靜態綁定在行為上衝突。重新定義預設參數可能導致混亂,即使預設值設定相同,仍可能在未來造成維護問題。

應盡量使用 NVI 避免這類風險,將預設行為限制於基底類別的邏輯內。


上一篇
[Day 14] Inheritance and Object-Oriented Design I
下一篇
[Day 16] Inheritance and Object-Oriented Design III
系列文
30 天 Effective C++ 大挑戰!!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Zoe Wu
iT邦新手 4 級 ‧ 2025-08-16 09:08:15

恭喜過半!

yoyochang iT邦新手 5 級 ‧ 2025-08-16 19:05:49 檢舉

也恭喜你開賽了! 一起加油 :)

我要留言

立即登入留言