MST

星途 面试题库

面试题:C++ 中虚函数与纯虚函数的区别

请详细阐述 C++ 中虚函数与纯虚函数在定义、作用以及应用场景上的区别。并举例说明在何种情况下会使用虚函数,何种情况下会使用纯虚函数。
47.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

定义区别

  1. 虚函数:在基类中使用 virtual 关键字声明的成员函数,在派生类中可以被重写(override)。虚函数在基类中有具体的函数实现。例如:
class Base {
public:
    virtual void func() {
        std::cout << "Base::func" << std::endl;
    }
};
  1. 纯虚函数:也是在基类中使用 virtual 关键字声明,但在声明语句后加上 = 0,表示该函数没有具体的实现,必须在派生类中被重写。例如:
class Base {
public:
    virtual void func() = 0;
};

作用区别

  1. 虚函数:实现多态性,通过基类指针或引用调用派生类中重写的函数版本。使得程序在运行时能够根据对象的实际类型来决定调用哪个函数,而不是根据指针或引用的静态类型。
  2. 纯虚函数:定义一个接口规范,强制派生类必须提供该函数的具体实现。含有纯虚函数的类是抽象类,不能被实例化,主要目的是为派生类提供一个通用的接口框架。

应用场景区别

  1. 虚函数应用场景:当基类有一些通用的行为实现,但派生类可能需要根据自身特点对该行为进行一些调整时,使用虚函数。比如图形绘制类:
class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape" << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle" << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a rectangle" << std::endl;
    }
};

int main() {
    Shape* shape1 = new Circle();
    Shape* shape2 = new Rectangle();
    shape1->draw(); 
    shape2->draw(); 
    delete shape1;
    delete shape2;
    return 0;
}

这里 Shape 类的 draw 函数定义了基本的绘制行为,CircleRectangle 类根据自身需求重写 draw 函数。 2. 纯虚函数应用场景:当基类无法为某些函数提供有意义的默认实现,且所有派生类都必须实现这些函数时,使用纯虚函数。例如几何图形计算面积:

class Shape {
public:
    virtual double area() = 0;
};

class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    double area() override {
        return 3.14159 * radius * radius;
    }
};

class Rectangle : public Shape {
private:
    double width;
    double height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    double area() override {
        return width * height;
    }
};

Shape 类作为抽象基类,定义了 area 纯虚函数,CircleRectangle 类必须实现 area 函数来计算各自的面积。