本條款對比面向對象(Class)與泛型編程的接口與多態機制。
class Widget {
public:
virtual size_t size() const;
virtual void normalize();
virtual void swap(Widget&);
};
void doProcessing(Widget& w) {
if (w.size() < 10 && w != nasty) {
Widget tmp(w);
tmp.normalize();
tmp.swap(w);
}
}
virtual 函數實現運行期多態:根據對象動態類型調用templatevoid doProcessing(T& w) { if (w.size() > 10 && w != nasty) { T tmp(w); tmp.normalize(); tmp.swap(w); } }
w.size()、w != nasty、拷貝構造、normalize()、swap()w.size() 返回類型不必是整數,只需支持 operator> (int)。w != nasty 只需存在可調用的 operator!=(參數可隱式轉換)。這比簽名匹配靈活得多。
| 維度 | Class (OOP) | Template (GP) |
|---|---|---|
| 接口類型 | 顯式 | 隱式 |
| 接口基礎 | 函數簽名 | 有效表達式 |
| 多態時機 | 運行期 | 編譯期 |
| 多態機制 | virtual 函數表 | 模板具現化 + 重載解析 |
| 類型要求 | 繼承關係 | 結構相容(鴨子類型) |
Class 和 Template 都支持接口和多態。Class:顯式接口、簽名中心、運行期 virtual。Template:隱式接口、表達式中心、編譯期具現化/重載。