C++純虛函數(shù)如何理解

c++
小樊
81
2024-11-09 04:22:35

在C++中,純虛函數(shù)是一種特殊類型的虛函數(shù),它在基類中沒有定義具體的實(shí)現(xiàn)。它的主要目的是強(qiáng)制派生類提供特定的實(shí)現(xiàn)。純虛函數(shù)的聲明以= 0結(jié)尾,表示它是一個(gè)純虛函數(shù)。

當(dāng)我們創(chuàng)建一個(gè)包含至少一個(gè)純虛函數(shù)的類時(shí),這個(gè)類被稱為抽象類。抽象類不能被實(shí)例化,也就是說,我們不能創(chuàng)建抽象類的對(duì)象。抽象類的主要作用是作為基類,為派生類提供一個(gè)共同的接口和一些通用的功能。

純虛函數(shù)的主要用途是實(shí)現(xiàn)多態(tài)。多態(tài)是指允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。通過將相同的函數(shù)調(diào)用應(yīng)用于不同的對(duì)象,我們可以根據(jù)對(duì)象的實(shí)際類型來執(zhí)行不同的操作。純虛函數(shù)使得我們可以將一組具有相同接口但實(shí)現(xiàn)不同的類歸為一個(gè)基類,從而實(shí)現(xiàn)多態(tài)。

以下是一個(gè)簡(jiǎn)單的純虛函數(shù)示例:

#include <iostream>

// 抽象類 Shape
class Shape {
public:
    // 構(gòu)造函數(shù)
    Shape() {
        std::cout << "Shape 構(gòu)造函數(shù)被調(diào)用" << std::endl;
    }

    // 虛析構(gòu)函數(shù)
    virtual ~Shape() {
        std::cout << "Shape 析構(gòu)函數(shù)被調(diào)用" << std::endl;
    }

    // 純虛函數(shù) area()
    virtual double area() const = 0;
};

// 派生類 Circle
class Circle : public Shape {
public:
    // 構(gòu)造函數(shù)
    Circle(double radius) : radius_(radius) {
        std::cout << "Circle 構(gòu)造函數(shù)被調(diào)用" << std::endl;
    }

    // 析構(gòu)函數(shù)
    ~Circle() {
        std::cout << "Circle 析構(gòu)函數(shù)被調(diào)用" << std::endl;
    }

    // 實(shí)現(xiàn)純虛函數(shù) area()
    double area() const override {
        return 3.14 * radius_ * radius_;
    }

private:
    double radius_;
};

// 派生類 Rectangle
class Rectangle : public Shape {
public:
    // 構(gòu)造函數(shù)
    Rectangle(double width, double height) : width_(width), height_(height) {
        std::cout << "Rectangle 構(gòu)造函數(shù)被調(diào)用" << std::endl;
    }

    // 析構(gòu)函數(shù)
    ~Rectangle() {
        std::cout << "Rectangle 析構(gòu)函數(shù)被調(diào)用" << std::endl;
    }

    // 實(shí)現(xiàn)純虛函數(shù) area()
    double area() const override {
        return width_ * height_;
    }

private:
    double width_;
    double height_;
};

int main() {
    // 由于 Shape 是抽象類,我們不能創(chuàng)建它的對(duì)象
    // Shape shape; // 錯(cuò)誤

    // 創(chuàng)建一個(gè)指向派生類對(duì)象的指針,指向基類
    Shape* shape = new Circle(5.0);
    std::cout << "面積: " << shape->area() << std::endl;

    delete shape; // 調(diào)用派生類的析構(gòu)函數(shù)

    shape = new Rectangle(4.0, 6.0);
    std::cout << "面積: " << shape->area() << std::endl;

    delete shape; // 調(diào)用派生類的析構(gòu)函數(shù)

    return 0;
}

在這個(gè)示例中,我們定義了一個(gè)抽象類Shape,它包含一個(gè)純虛函數(shù)area()。然后,我們創(chuàng)建了兩個(gè)派生類CircleRectangle,它們分別表示圓形和矩形,并實(shí)現(xiàn)了area()函數(shù)。在main()函數(shù)中,我們使用基類指針指向派生類對(duì)象,并通過基類指針調(diào)用area()函數(shù),實(shí)現(xiàn)了多態(tài)。

0