C++ 面试题 目录

C++ 中虚函数 (virtual function) 的作用是什么?

推荐答案

虚函数(virtual function)是C++中实现多态(polymorphism)的关键机制。它允许在基类中定义一个函数,并在派生类中重写该函数,使得通过基类指针或引用调用该函数时,实际执行的是派生类中的版本。虚函数的主要作用如下:

  1. 实现运行时多态:通过基类指针或引用调用虚函数时,程序会根据实际对象的类型来决定调用哪个版本的函数,而不是根据指针或引用的类型。
  2. 支持动态绑定:虚函数的调用是在运行时决定的,而不是在编译时决定的,这称为动态绑定或晚绑定。
  3. 增强代码的灵活性和可扩展性:通过虚函数,可以在不修改现有代码的情况下,通过派生类扩展基类的行为。

本题详细解读

1. 虚函数的定义与使用

在C++中,虚函数通过在基类中使用virtual关键字来声明。派生类可以重写(override)这个虚函数,提供自己的实现。例如:

-- -------------------- ---- -------
----- ---- -
-------
    ------- ---- ------ -
        --------- -- ----- ----- ---- --------- -- ----------
    -
--

----- ------- - ------ ---- -
-------
    ---- ------ -------- -
        --------- -- -------- ----- ---- --------- -- ----------
    -
--

在上面的代码中,Base类中的show函数被声明为虚函数,Derived类重写了这个函数。

2. 多态的实现

通过基类指针或引用调用虚函数时,实际调用的是派生类的函数版本。例如:

在这个例子中,尽管basePtrBase类型的指针,但它指向的是Derived类的对象。因此,调用show函数时,实际执行的是Derived类中的show函数。

3. 虚函数表(vtable)

C++通过虚函数表(vtable)来实现虚函数的动态绑定。每个包含虚函数的类都有一个虚函数表,表中存储了指向该类虚函数的指针。当通过基类指针或引用调用虚函数时,编译器会通过虚函数表找到正确的函数地址并调用。

4. 纯虚函数与抽象类

纯虚函数是在基类中声明但不实现的虚函数,通过在函数声明后加上= 0来定义。包含纯虚函数的类称为抽象类,不能实例化。派生类必须实现所有的纯虚函数才能实例化。

-- -------------------- ---- -------
----- ------------ -
-------
    ------- ---- --------------------- - --  -- ----
--

----- --------------- - ------ ------------ -
-------
    ---- --------------------- -------- -
        --------- -- ------------ ---- ------- --------- -- ----------
    -
--

5. 虚析构函数

当基类的析构函数是虚函数时,通过基类指针删除派生类对象时,会正确调用派生类的析构函数,确保资源正确释放。

-- -------------------- ---- -------
----- ---- -
-------
    ------- ------- -
        --------- -- ----- ----------- -- ----------
    -
--

----- ------- - ------ ---- -
-------
    ---------- -
        --------- -- -------- ----------- -- ----------
    -
--

----- ------- - --- ----------
------ --------  -- --- ------- ---------------- ----------

6. 虚函数的性能开销

虚函数的调用涉及到虚函数表的查找,因此相比于普通函数调用,虚函数调用会有一定的性能开销。在性能敏感的代码中,应谨慎使用虚函数。

纠错
反馈