首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

高品質 C++/C 程式設計指南 第 10 章 (上):繼承與組合的核心法則

     編輯:關於C++

面向對象設計的重點:類別而非物件

物件是類別的實例。類別 = 設計圖,物件 = 房子。**設計孤立類別易,設計正確繼承體系難**。本章聚焦「繼承」與「組合」概念。

註:當前熱點 COM/CORBA 超出本書範疇,請參閱專書。

10.1 繼承:Is-a 關係的嚴格定義

基本機制

class A { public: void Func1(); void Func2(); };
class B : public A { public: void Func3(); void Func4(); };

B b;
b.Func1(); // 繼承自 A
b.Func2(); // 繼承自 A
b.Func3(); // 自有
b.Func4(); // 自有

繼承提升複用性,但**因太好用、太容易,必須立規矩防濫用**。

規則 10-1-1:無關類別嚴禁繼承

別為了「白撿功能」讓健壯青年無故吃人參。類別間無邏輯關聯時,**組合或獨立設計**才是正道。

規則 10-1-2:Is-a (一種) 關係才允許繼承

class Human { ... };
class Man : public Human { ... };   // 男人是人
class Boy : public Man { ... };     // 男孩是男人

陷阱:現實世界的 Is-a ≠ 程式世界的 Is-a

現實分類程式建模衝突
鴕鳥 是 鳥鳥有 Fly(),鴕鳥飛不了 → Ostrich::Fly 怎麼辦?
圓 是 橢圓橢圓有長/短軸,圓繼承後長短軸多餘 → 畫蛇添足

嚴格繼承規則

若 B 是 A 的一種,且 A 的所有功能屬性對 B 均有意義,方允許繼承。

違反者須用組合、介面隔離或策略模式重構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved