温馨提示×

C++函数对象怎样进行类型擦除

c++
小樊
81
2024-10-30 16:18:25
栏目: 编程语言

在C++中,类型擦除通常是通过虚函数实现的。虚函数允许你在基类中定义一个接口,然后通过派生类来覆盖这个接口。这样,当你使用基类指针或引用调用虚函数时,实际调用的函数将由对象的实际类型决定。这里有一个简单的例子来说明如何使用虚函数实现类型擦除:

#include <iostream>
#include <string>

// 基类
class Shape {
public:
    // 虚函数,用于计算面积
    virtual double area() const = 0;

    // 虚析构函数,确保派生类的析构函数被正确调用
    virtual ~Shape() = default;
};

// 派生类:圆形
class Circle : public Shape {
public:
    Circle(double radius) : radius_(radius) {}

    // 覆盖基类的虚函数
    double area() const override {
        return 3.14159 * radius_ * radius_;
    }

private:
    double radius_;
};

// 派生类:矩形
class Rectangle : public Shape {
public:
    Rectangle(double width, double height) : width_(width), height_(height) {}

    // 覆盖基类的虚函数
    double area() const override {
        return width_ * height_;
    }

private:
    double width_;
    double height_;
};

int main() {
    Shape* shape1 = new Circle(5.0);
    Shape* shape2 = new Rectangle(4.0, 6.0);

    std::cout << "Circle area: " << shape1->area() << std::endl;
    std::cout << "Rectangle area: " << shape2->area() << std::endl;

    delete shape1;
    delete shape2;

    return 0;
}

在这个例子中,我们定义了一个名为Shape的基类,其中包含一个纯虚函数area()。然后,我们创建了两个派生类CircleRectangle,分别表示圆形和矩形。这两个派生类都覆盖了area()函数,以提供各自的实现。

main()函数中,我们使用基类指针shape1shape2分别指向CircleRectangle对象。当我们调用area()函数时,实际调用的函数将由对象的实际类型决定。这就是类型擦除的基本原理。

0