1. 引言
在 C++ 面向对象编程中,虚函数和虚基类是两个核心特性:
- 虚函数是实现动态多态的基础,允许子类重写父类方法,运行时根据对象实际类型调用对应函数;
- 虚基类用于解决菱形继承中的数据冗余和二义性问题,确保间接基类的成员在派生类中只存在一份拷贝。
本文将从概念、语法、原理、实战四个维度,全面解析两者的使用场景与核心要点。
2. 虚函数(Virtual Function)
2.1 核心概念
虚函数是在基类中用 virtual 关键字声明的成员函数,其核心作用是:允许子类重写该函数,并且在通过基类指针 / 引用调用时,会根据对象的实际类型(而非指针 / 引用的类型)执行对应的子类实现。
2.2 语法格式
// 基类中声明虚函数
class Base {
public:
// 虚函数声明(virtual 关键字仅需在基类中添加)
virtual void show() {
cout << "Base" << endl;
}
};
// 子类重写虚函数(无需重复 virtual,但若加也合法)
class Derived : public Base {
public:
// 重写(override 关键字可选,用于显式声明重写,编译器会检查语法正确性)
void show() override {
cout << "Derived" << endl;
}
};
2.3 动态多态实现原理
虚函数的动态绑定依赖于 虚函数表(vtable) 和 虚表指针(vptr):
- 每个包含虚函数的类(及其子类)会生成一个独立的虚函数表(vtable),存储该类所有虚函数的地址;
- 每个该类的对象会隐含一个虚表指针(vptr),指向所属类的 vtable;
- 当通过基类指针 / 引用调用虚函数时,编译器会通过 vptr 找到对应的 vtable,再根据函数索引调用实际的函数实现(运行时绑定)。
2.4 实战示例
#include <iostream>
using namespace std;
// 基类
{
:
{
cout << << endl;
}
};
: Animal {
:
{
cout << << endl;
}
};
: Animal {
:
{
cout << << endl;
}
};
{
Animal* animal1 = ();
Animal* animal2 = ();
animal1->();
animal2->();
animal1;
animal2;
;
}

