MST

星途 面试题库

面试题:C++ 多态中对象特征的基础应用

请阐述 C++ 中虚函数和纯虚函数的区别,以及它们在实现多态性过程中各自所起的作用,并举例说明如何通过基类指针或引用调用派生类中重写的虚函数。
11.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

虚函数和纯虚函数的区别

  1. 定义方式
    • 虚函数:在基类中使用 virtual 关键字声明,并且在基类中有具体实现。例如:
class Base {
public:
    virtual void func() {
        std::cout << "Base::func" << std::endl;
    }
};
- **纯虚函数**:在基类中使用 `virtual` 关键字声明,同时在声明语句后加上 ` = 0`,且基类中没有具体实现。例如:
class Base {
public:
    virtual void func() = 0;
};
  1. 作用
    • 虚函数:为派生类提供一个默认实现,派生类可以选择重写(override)该函数,以实现自己的特定行为。
    • 纯虚函数:强制要求派生类必须重写该函数,用于定义抽象基类,抽象基类不能实例化对象。
  2. 类的性质
    • 虚函数:包含虚函数的类可以实例化对象。
    • 纯虚函数:包含纯虚函数的类是抽象基类,不能实例化对象,只有派生类重写了所有纯虚函数后,该派生类才能实例化对象。

在实现多态性过程中各自所起的作用

  1. 虚函数:通过在基类中定义虚函数,派生类重写该虚函数,当通过基类指针或引用调用该函数时,会根据指针或引用实际指向的对象类型,调用相应派生类的函数版本,从而实现动态多态。它允许派生类在继承基类基本功能的基础上,进行个性化定制。
  2. 纯虚函数:定义了一组接口规范,要求所有派生类必须实现这些接口,以保证派生类具有统一的行为模式。它使得基类成为一个抽象概念,强调的是接口的一致性,通过这种方式实现多态性,能让不同派生类以符合自身特点的方式实现相同的接口。

通过基类指针或引用调用派生类中重写的虚函数示例

#include <iostream>

class Base {
public:
    virtual void print() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->print();

    Derived derivedObj;
    Base& baseRef = derivedObj;
    baseRef.print();

    delete basePtr;
    return 0;
}

在上述代码中,通过 Base* basePtr = new Derived(); 创建了一个指向 Derived 对象的基类指针 basePtr,调用 basePtr->print(); 时,实际调用的是 Derived 类中重写的 print 函数。同样,通过 Base& baseRef = derivedObj; 创建了一个基类引用 baseRef,它引用 Derived 对象 derivedObj,调用 baseRef.print(); 也会调用 Derived 类中重写的 print 函数,从而实现了多态。