MST
星途 面试题库

面试题:C++ 中纯虚函数与抽象类的基础应用

请简述 C++ 中纯虚函数的定义方式,并说明如何基于纯虚函数创建一个抽象类。同时给出一个简单的代码示例,展示抽象类的使用场景,例如在图形绘制的基类设计中如何应用。
29.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 纯虚函数的定义方式: 纯虚函数是在基类中声明的虚函数,它在基类中没有定义具体的实现,要求任何派生类都必须定义自己的实现版本。定义方式为在虚函数声明的结尾加上 = 0。例如:
virtual void function() = 0;
  1. 基于纯虚函数创建抽象类: 当一个类至少包含一个纯虚函数时,这个类就成为抽象类。抽象类不能被实例化,主要用于为派生类提供一个通用的接口。
  2. 代码示例(图形绘制基类设计)
#include <iostream>

// 抽象基类 Shape
class Shape {
public:
    // 纯虚函数,用于绘制图形
    virtual void draw() = 0;
    // 纯虚函数,用于计算面积
    virtual double area() = 0;
};

// 派生类 Circle
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    // 实现 draw 函数
    void draw() override {
        std::cout << "Drawing a Circle with radius " << radius << std::endl;
    }
    // 实现 area 函数
    double area() override {
        return 3.14159 * radius * radius;
    }
};

// 派生类 Rectangle
class Rectangle : public Shape {
private:
    double width;
    double height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    // 实现 draw 函数
    void draw() override {
        std::cout << "Drawing a Rectangle with width " << width << " and height " << height << std::endl;
    }
    // 实现 area 函数
    double area() override {
        return width * height;
    }
};

int main() {
    // Shape s; // 错误,抽象类不能实例化
    Shape* shapes[2];
    shapes[0] = new Circle(5);
    shapes[1] = new Rectangle(4, 6);

    for (int i = 0; i < 2; ++i) {
        shapes[i]->draw();
        std::cout << "Area: " << shapes[i]->area() << std::endl;
        delete shapes[i];
    }

    return 0;
}

在上述示例中,Shape 类是一个抽象类,包含两个纯虚函数 drawareaCircleRectangle 类继承自 Shape 类,并实现了这些纯虚函数。在 main 函数中,通过抽象类指针数组来调用不同派生类的 drawarea 函数,展示了多态性。