首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Effective C++ 條款 41:隱式接口與編譯期多態(Template vs Class)

     編輯:C++ 入門

Effective C++ 條款 41:隱式接口與編譯期多態(Template vs Class)

本條款對比面向對象(Class)與泛型編程的接口與多態機制。

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 函數實現運行期多態:根據對象動態類型調用
  • 編譯期可見接口定義(頭文件)

Template:隱式接口 + 編譯期多態

template
void doProcessing(T& w) {
    if (w.size() > 10 && w != nasty) {
        T tmp(w);
        tmp.normalize();
        tmp.swap(w);
    }
}
  • 接口由有效表達式構成:w.size()、w != nasty、拷貝構造、normalize()、swap()
  • 無需繼承共同基類,只需支持這些操作
  • 編譯期多態:模板具現化時根據實際類型生成代碼,調用解析在編譯期完成
  • 類似重載解析而非 virtual 分發

隱式接口的靈活性

w.size() 返回類型不必是整數,只需支持 operator> (int)。w != nasty 只需存在可調用的 operator!=(參數可隱式轉換)。這比簽名匹配靈活得多。

核心對比表

維度Class (OOP)Template (GP)
接口類型顯式隱式
接口基礎函數簽名有效表達式
多態時機運行期編譯期
多態機制virtual 函數表模板具現化 + 重載解析
類型要求繼承關係結構相容(鴨子類型)

記住

Class 和 Template 都支持接口和多態。Class:顯式接口、簽名中心、運行期 virtual。Template:隱式接口、表達式中心、編譯期具現化/重載。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved