当前位置:首页 C++ > 正文

c++纯虚函数的使用场景

作者:野牛程序员:2023-07-23 13:16:37 C++阅读 2757

C++中的纯虚函数(pure virtual function)是一个在基类中声明的没有定义的虚函数。它的声明形式是在函数原型的末尾加上 "= 0"。纯虚函数使得该函数成为抽象函数,这意味着该函数没有实际的实现,而是由派生类来实现。纯虚函数的存在使得基类成为一个抽象类,而抽象类不能被实例化,只能被用作其他类的基类。

使用纯虚函数的场景包括:

  1. 定义接口: 纯虚函数用于定义一个类的接口,规定所有派生类必须实现的一组操作。这样可以确保派生类具有一定的共性和规范。

  2. 多态性: 纯虚函数为实现运行时多态性提供了支持。通过指向派生类对象的基类指针或引用调用纯虚函数,可以在运行时确定使用的是派生类的版本。

  3. 不完整的类: 如果基类中有纯虚函数,但派生类没有实现它,那么派生类也会变成抽象类,从而避免创建不完整的类对象。

  4. 模板方法模式: 在模板方法模式中,基类定义了一个算法框架,其中一些步骤通过纯虚函数委托给派生类来实现,从而允许派生类定制特定的步骤,但整体算法的结构保持不变。

  5. 接口继承: 如果你希望派生类只继承接口而不继承实现,可以在基类中使用纯虚函数。

示例代码:

class Shape {
public:
    // 纯虚函数,表示派生类必须实现这些函数
    virtual double getArea() const = 0;
    virtual void draw() const = 0;

    // 普通成员函数
    void displayArea() const {
        std::cout << "Area: " << getArea() << std::endl;
    }
};

class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}

    // 必须实现纯虚函数
    double getArea() const override {
        return 3.14 * radius * radius;
    }

    void draw() const override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

class Square : public Shape {
private:
    double side;
public:
    Square(double s) : side(s) {}

    // 必须实现纯虚函数
    double getArea() const override {
        return side * side;
    }

    void draw() const override {
        std::cout << "Drawing a square." << std::endl;
    }
};

int main() {
    // 不可以创建Shape对象,因为它是抽象类
    // Shape shape; // 错误!

    Circle circle(5);
    Square square(4);

    Shape* shape1 = &circle;
    Shape* shape2 = &square;

    shape1->draw(); // 输出: "Drawing a circle."
    shape1->displayArea(); // 输出: "Area: 78.5"

    shape2->draw(); // 输出: "Drawing a square."
    shape2->displayArea(); // 输出: "Area: 16"

    return 0;
}

在上述示例中,Shape 类是一个抽象类,因为它有纯虚函数。 CircleSquare 类继承自 Shape 类,并分别实现了纯虚函数 getAreadraw。通过指向基类的指针,可以在运行时调用不同派生类的实现,实现多态性。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击