Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

virtual function 和 template 的主要差異和使用時機:

  1. Virtual Function 的特點:
  • 運行時多態(Runtime Polymorphism)
  • 有額外的效能開銷(virtual table lookup)
  • 適合處理已知的類型層次結構
  • 主要用於繼承關係中的動態分派
  1. Template 的特點:
  • 編譯時多態(Compile-time Polymorphism)
  • 沒有運行時開銷
  • 可以處理任意類型
  • 產生專門的程式碼,可能造成程式碼膨脹

使用建議:

  1. 使用 Virtual Function 的情況:
// 當你需要在運行時根據對象類型來決定行為時
class Shape {
public:
    virtual double area() = 0;
};

class Circle : public Shape {
public:
    double area() override { return PI * radius * radius; }
private:
    double radius;
};

class Rectangle : public Shape {
public:
    double area() override { return width * height; }
private:
    double width, height;
};
  1. 使用 Template 的情況:
// 當你需要對不同類型執行相同的操作時
template<typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

// 或是泛型容器
template<typename T>
class Array {
    T* data;
    size_t size;
public:
    T& operator[](size_t index) { return data[index]; }
};
  1. 選擇準則:
  • 如果需要在運行時動態決定呼叫哪個函數 → Virtual Function
  • 如果需要處理不同但在編譯時已知的類型 → Template
  • 如果效能是關鍵考量 → Template
  • 如果需要維護類型層次結構 → Virtual Function
  1. 混合使用的情況:
// 有時候可以結合兩者的優點
template<typename T>
class Container {
public:
    virtual void process(const T& item) = 0;
};

template<typename T>
class SpecialContainer : public Container<T> {
public:
    void process(const T& item) override {
        // 特定實現
    }
};

需要注意的是,template 會在編譯期間產生多份程式碼,可能導致執行檔變大。而 virtual function 則會有一些執行時的效能開銷。選擇時要根據實際需求來權衡。

想了解更多細節或有特定的使用場景需要討論嗎?