virtual function 和 template 的主要差異和使用時機:
- Virtual Function 的特點:
- 運行時多態(Runtime Polymorphism)
- 有額外的效能開銷(virtual table lookup)
- 適合處理已知的類型層次結構
- 主要用於繼承關係中的動態分派
- Template 的特點:
- 編譯時多態(Compile-time Polymorphism)
- 沒有運行時開銷
- 可以處理任意類型
- 產生專門的程式碼,可能造成程式碼膨脹
使用建議:
- 使用 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;
};
- 使用 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]; }
};
- 選擇準則:
- 如果需要在運行時動態決定呼叫哪個函數 → Virtual Function
- 如果需要處理不同但在編譯時已知的類型 → Template
- 如果效能是關鍵考量 → Template
- 如果需要維護類型層次結構 → Virtual Function
- 混合使用的情況:
// 有時候可以結合兩者的優點
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 則會有一些執行時的效能開銷。選擇時要根據實際需求來權衡。
想了解更多細節或有特定的使用場景需要討論嗎?