MST

星途 面试题库

面试题:C++ 中纯虚函数在接口设计里如何体现多态性

请详细阐述在 C++ 类中,纯虚函数是怎样通过接口设计来实现多态性的,并用代码示例说明。
14.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 纯虚函数与接口设计实现多态性的原理
    • 在C++中,纯虚函数是一种特殊的虚函数,它在基类中只声明而不定义,其语法形式为在虚函数声明后加上 = 0
    • 包含纯虚函数的类被称为抽象类,抽象类不能实例化对象。
    • 接口设计通常是通过抽象类来实现的,抽象类定义了一组纯虚函数,这些纯虚函数就是接口的规范。
    • 派生类继承抽象类后,必须实现抽象类中的所有纯虚函数,否则派生类也将成为抽象类。
    • 当通过基类指针或引用调用这些纯虚函数时,C++的动态绑定机制会根据对象的实际类型来调用相应派生类的实现,从而实现多态性。
  2. 代码示例
#include <iostream>

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

// 派生类,继承自Shape
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    // 实现基类的纯虚函数,计算圆的面积
    double area() const override {
        return 3.14159 * radius * radius;
    }
    // 实现基类的纯虚函数,绘制圆
    void draw() const override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

// 派生类,继承自Shape
class Rectangle : public Shape {
private:
    double width;
    double height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    // 实现基类的纯虚函数,计算矩形的面积
    double area() const override {
        return width * height;
    }
    // 实现基类的纯虚函数,绘制矩形
    void draw() const override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};

int main() {
    // 创建Shape类型的指针数组
    Shape* shapes[2];
    shapes[0] = new Circle(5.0);
    shapes[1] = new Rectangle(4.0, 3.0);

    // 通过基类指针调用派生类的函数,实现多态
    for (int i = 0; i < 2; ++i) {
        std::cout << "Area of shape " << i + 1 << " is: " << shapes[i]->area() << std::endl;
        shapes[i]->draw();
        delete shapes[i];
    }

    return 0;
}

在上述代码中,Shape 类是一个抽象类,包含两个纯虚函数 areadraw,这两个函数定义了形状相关操作的接口。CircleRectangle 类继承自 Shape 类,并实现了这些纯虚函数。在 main 函数中,通过 Shape 类型的指针数组来存储不同派生类对象的指针,当调用 areadraw 函数时,会根据指针实际指向的对象类型(CircleRectangle)来调用相应的函数实现,从而展示了多态性。