C++ Interface inheritance and Implement inheritance

繼承分為 interface 繼承與 implement 繼承。interface 繼承僅繼承 interface,implementation 部分則由繼承者決定。implement 繼承則連同實作一同繼承。

C++ 語意上用 virtual 區分 base class 希望 derived class 自己定義與不希望 derived class 修改的 function,virtual 為希望 derived class 自行定義,non-virtual 則不希望 derived class 修改。

C++ 在區分 interface 及 implement 繼承上有:

  • pure virtual function
  • impure virtual function
  • non-virtual function

C++ virtual and inheritance

pure virtual function

pure virtual function 是為了讓 derived class 繼承 base class 的 interface,而 implementation 則由 derived class 全權處理。當一 class 宣告 pure virtual function 時,代表要求 derived class 必須 implement 這些 pure virtual function(沒寫會 compile error),通常是這個繼承體系所需要的共同性質。

impure virtual function

impure virtual function 是為了讓 derived class 繼承 interface 及預設的 implementation。也就是說,derived class 可以自己實作,也可以直接用 base class 的實作。

這有個風險是,因為在 derived class 中並不強迫要寫出 base class 的 impure virtual function,導致在 derived class 應該有自己實作的狀況下,programmer 可能忘記在 derived class 實作。

non-virtual function

non-virtual function 主要是為了讓 derived class 繼承 base class 的實作。

雖然語法上 derived class 可 override base class 的 non-virtual function,但語意上的設計不建議 derived class override base class 的 non-virtual function。另外,override virtual function 跟 override non-virtual function 在實際執行上會有不同行為。

non-virtua function 是 static binding。在一個繼承體系中 call non-virtual function 時會直接 call 宣告 type 的 class function。如果 derived class 沒有 override function,則因繼承關係 call 到 base class 的 function。如果 dervied class override function,則會 call 到 derived class 的。

Ref

  • 《Effective C++》Differentiate between inheritance of interface and inheritance of implementation.