在C++中,純虛函數是一種特殊類型的虛函數,它在基類中沒有定義具體的實現。它的主要目的是強制派生類提供特定的實現。純虛函數的聲明以= 0
結尾,表示它是一個純虛函數。
當我們創建一個包含至少一個純虛函數的類時,這個類被稱為抽象類。抽象類不能被實例化,也就是說,我們不能創建抽象類的對象。抽象類的主要作用是作為基類,為派生類提供一個共同的接口和一些通用的功能。
純虛函數的主要用途是實現多態。多態是指允許不同類的對象對同一消息做出響應。通過將相同的函數調用應用于不同的對象,我們可以根據對象的實際類型來執行不同的操作。純虛函數使得我們可以將一組具有相同接口但實現不同的類歸為一個基類,從而實現多態。
以下是一個簡單的純虛函數示例:
#include <iostream>
// 抽象類 Shape
class Shape {
public:
// 構造函數
Shape() {
std::cout << "Shape 構造函數被調用" << std::endl;
}
// 虛析構函數
virtual ~Shape() {
std::cout << "Shape 析構函數被調用" << std::endl;
}
// 純虛函數 area()
virtual double area() const = 0;
};
// 派生類 Circle
class Circle : public Shape {
public:
// 構造函數
Circle(double radius) : radius_(radius) {
std::cout << "Circle 構造函數被調用" << std::endl;
}
// 析構函數
~Circle() {
std::cout << "Circle 析構函數被調用" << std::endl;
}
// 實現純虛函數 area()
double area() const override {
return 3.14 * radius_ * radius_;
}
private:
double radius_;
};
// 派生類 Rectangle
class Rectangle : public Shape {
public:
// 構造函數
Rectangle(double width, double height) : width_(width), height_(height) {
std::cout << "Rectangle 構造函數被調用" << std::endl;
}
// 析構函數
~Rectangle() {
std::cout << "Rectangle 析構函數被調用" << std::endl;
}
// 實現純虛函數 area()
double area() const override {
return width_ * height_;
}
private:
double width_;
double height_;
};
int main() {
// 由于 Shape 是抽象類,我們不能創建它的對象
// Shape shape; // 錯誤
// 創建一個指向派生類對象的指針,指向基類
Shape* shape = new Circle(5.0);
std::cout << "面積: " << shape->area() << std::endl;
delete shape; // 調用派生類的析構函數
shape = new Rectangle(4.0, 6.0);
std::cout << "面積: " << shape->area() << std::endl;
delete shape; // 調用派生類的析構函數
return 0;
}
在這個示例中,我們定義了一個抽象類Shape
,它包含一個純虛函數area()
。然后,我們創建了兩個派生類Circle
和Rectangle
,它們分別表示圓形和矩形,并實現了area()
函數。在main()
函數中,我們使用基類指針指向派生類對象,并通過基類指針調用area()
函數,實現了多態。