c++中類的繼承關係有public 繼承、protected繼承、private繼承三種。對於public inheritance應該說是面向對象編程中用得最多的,也是精華所在。
1、公有繼承意味着is a kind of 的關係。
即任何派生類對象is a kind of 基類對象,任何出現基類對象的地方都應該允許派生對象去實例化它。這也是針對接口編程的理論基礎,在系統高層,我們不應該針對具體類編程而應該針對抽象的接口編程。這樣纔可以保證程序的可擴展性,做到對修改關閉對擴展開放。
看一下簡單的示例:
class IDevice
{
public:
IDevice(void);
virtual ~IDevice(void);
// 連接設備
virtual bool ConnectDevice() = 0;
// 斷開設備
virtual bool DisconnectDevice() = 0;
// 獲取設備狀態
virtual bool GetDeviceStatus() = 0;
// 獲取數據
virtual bool GetDeviceData(BYTE *piByteData, DWORD &pidwLength) = 0;
/// ....
};
// 串口設備
class CDeviceSerial:public IDevice
{
CDeviceSerial()
// ...
}
// 網口設備
class CDeviceSocket: public IDevice
{
CDeviceSocket();
}
// ...
之後系統中用的各種設備均繼承以上基類,這樣在應用上層不需要關心具體通信協議時就完全可以針對抽象的設備接口編程,
使用特定的設備對象實例化抽象抽象設備,而不需要關心設備具體的工作方式。實現了高層模塊不依賴底層模塊而只依賴抽象,
當然,對系統進行正確的建模抽象是最重要的一步。在這裏,體現了public繼承的is a kind of 語義,任何出現基類對象的地方都應該可以使用派生類對象實例化它。以後業務需求變了,只需要重寫一個派生類即可,高層邏輯應該是不需要變動的。
簡單的public 繼承實際上包含了接口繼承和實現繼承。
在上述抽象設備接口中是純虛函數,以爲着派生類只繼承基類的函數接口,自己必須實現它,否則該派生類還是一個抽象類。
對於virtual 函數而不是pure virtual函數,派生類繼承該函數的接口和一份基類的默認實現,必要時可以重寫它。
而對於基類的non-virtual函數,意味着派生類絕不應該重寫它,也就是一種實現繼承,派生類中可以利用基類已實現的功能實現新的功能。