某次面試被問到「virtual base class」,才發現自己對 C++ 多重繼承中的菱形繼承解決方案已生疏。趁機整理兩大語言中 virtual、abstract 的關鍵差異。
| 概念 | C++ | C# |
|---|---|---|
| 虛方法 | virtual 修飾,派生類可 override | virtual 修飾方法/屬性,派生類可 override |
| 純虛方法/抽象方法 | virtual void foo() = 0;(無實現) | abstract void Foo();(無實現,類必須標 abstract) |
| 抽象類 | 包含純虛函數的類(abstract 非關鍵字) | abstract class 關鍵字,可含抽象成員 |
| 虛基類 | class B : virtual public A 解決多重繼承菱形問題 | 無多重繼承,故無此概念 |
=0 標記,強制派生類實現,構成介面契約。abstract 只是稱呼,非關鍵字。virtual 權力下放:僅用於標記可覆寫成員,多態相關權力被 interface、abstract 分流。abstract 全能修飾:可用於 class、method、property、indexer、event,專司「定義門面」。C++ 以 virtual 一統多態與菱形解決;C# 將「契約定義」剝離給 abstract/interface,語義更清晰。理解兩者差異,有助於跨語言架構設計與遷移重構。