繼承是面向對象三大特性之一,但 C++ 與 Java 在繼承模型上存在本質差異。本文從繼承方式、多重繼承、訪問控制、接口機制四個維度深度對比,幫助雙語言開發者避免認知偏差。
| 繼承方式 | 基類 public/protected 成員在派生類中訪問性 | 基類 private 成員 | 派生類對象訪問基類成員 |
|---|---|---|---|
| public (公有繼承) | 保持原訪問級別 | 隱藏,不可訪問 | 僅可訪問 public 成員 |
| protected (保護繼承) | 均變為 protected | 隱藏,不可訪問 | 不可訪問任何基類成員 |
| private (私有繼承) | 均變為 private | 隱藏,不可訪問 | 不可訪問任何基類成員 |
核心差異:C++ 繼承方式決定了「基類接口在派生類中的可見性」,支援「is-a」(public) 與「implemented-in-terms-of」(private/protected) 兩種語義。
class Child extends Parent —— 只能繼承一個父類class Impl implements InterfaceA, InterfaceB —— 可實現多個接口interface Sub extends SuperA, SuperB —— 接口可多繼承接口| 特性 | C++ | Java |
|---|---|---|
| 多重繼承 | 支援 class D : public A, public B | 類單繼承,接口多實現模擬 |
| 菱形繼承問題 | 虛繼承 virtual public Base 解決 | 接口無狀態,天然無菱形問題 |
| 同名成員衝突 | 作用域解析符 A::func() 顯式調用 | 編譯報錯,需在實現類中顯式覆寫 |
| 構造器調用順序 | 基類按聲明順序構造 | 單鏈調用 super() |
| 修飾符 | C++ | Java |
|---|---|---|
| public | 全域可見 | 全域可見 |
| protected | 派生類 + 同類可見 | 同包 + 子類可見 (跨包僅子類) |
| private | 僅本類可見 | 僅本類可見 |
| package-private (默認) | 無對應 | 同包可見 |
關鍵差異:Java protected 向包開放,C++ protected 嚴格限於繼承體系;Java 無「友元」機制,C++ 有 friend 破壞封裝。
~Class() 確定性釋放資源 (RAII)super();無析構器,依賴 GC + try-with-resources/AutoCloseableC++:提供機制不限制政策,信任程序員,支援組合、私有繼承、多重繼承、模板元編程,適合系統級、高性能場景。
Java:限制機制強制政策,單繼承+接口簡化複雜度,GC 托底內存安全,適合企業級應用快速交付。