MST

星途 面试题库

面试题:C++ 中虚函数与纯虚函数在多态实现中的作用及区别

请阐述在 C++ 多态实现过程中,虚函数和纯虚函数分别扮演了怎样的角色,它们在定义、使用场景以及对类的影响上有哪些区别?
42.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

定义区别

  1. 虚函数:在基类中使用 virtual 关键字声明的成员函数,其在基类中有具体实现。例如:
class Base {
public:
    virtual void func() {
        std::cout << "Base::func" << std::endl;
    }
};
  1. 纯虚函数:在基类中声明且没有具体实现,声明格式为在函数声明后加上 = 0。例如:
class Base {
public:
    virtual void func() = 0;
};

使用场景区别

  1. 虚函数:用于实现多态,当基类的某个函数在不同派生类中有不同实现方式,但基类中可能存在一个通用的默认实现时使用。比如一个图形类 Shape 有一个 draw 虚函数,不同形状如 CircleRectangle 继承 Shape 并重写 draw 函数来实现各自的绘制逻辑,而 Shape 中的 draw 可以提供一个通用提示。
  2. 纯虚函数:用于定义抽象基类,当基类的某个函数在基类中没有实际意义,必须由派生类去实现才有意义时使用。例如 Animal 类有一个 makeSound 纯虚函数,具体的 DogCat 等派生类继承 Animal 并实现 makeSound 函数来发出各自的声音。

对类的影响区别

  1. 虚函数:包含虚函数的类可以被实例化,即可以创建对象。因为虚函数在基类有实现,所以对象可以调用该虚函数(即使派生类重写了,也可以通过基类指针或引用调用基类版本)。
  2. 纯虚函数:包含纯虚函数的类为抽象基类,不能被实例化。只有派生类实现了所有纯虚函数后,该派生类才能被实例化。例如上述 Base 类不能创建对象,而如果有 class Derived : public Base { public: void func() override { std::cout << "Derived::func" << std::endl; } };Derived 类可以创建对象。