1. C++虚函数核心概念解析
虚函数是C++实现运行时多态的核心机制,它允许派生类重写基类的成员函数。当通过基类指针或引用调用虚函数时,实际调用的是对象所属派生类的实现版本。这种特性在面向对象设计中至关重要,特别是在需要处理多种派生类对象的统一接口时。
1.1 虚函数的基本语法
在成员函数声明前加上virtual关键字即可将其声明为虚函数:
cpp复制class Base {
public:
virtual void show() { // 虚函数声明
cout << "Base class show" << endl;
}
};
class Derived : public Base {
public:
void show() override { // 派生类重写
cout << "Derived class show" << endl;
}
};
这里有几个关键点需要注意:
virtual关键字只需在基类声明中使用,派生类中可省略- C++11引入的
override关键字明确表示这是对虚函数的重写,可帮助编译器检查是否正确覆盖 - 虚函数的返回类型和参数列表必须完全匹配(协变返回类型除外)
提示:现代C++开发中建议总是使用
override关键字,这可以避免因拼写错误或参数不匹配导致意外创建新函数而非覆盖虚函数的情况。
1.2 虚函数表(vtable)原理
每个包含虚函数的类都有一个虚函数表,这是实现动态绑定的关键。当类包含虚函数时,编译器会隐式添加一个指向虚函数表的指针(通常称为vptr)。虚函数表中按声明顺序存储了该类所有虚函数的地址。
调用虚函数时,实际执行以下步骤:
- 通过对象获取vptr
- 通过vptr找到虚函数表
- 从表中获取函数地址
- 调用该地址对应的函数
这种间接调用带来了运行时灵活性,但也引入了额外的开销:
- 每个对象需要额外存储vptr指针(通常4或8字节)
- 每次调用需要额外的指针解引用操作
- 编译器难以对虚函数调用进行内联优化
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 虚函数的高级应用技巧
2.1 纯虚函数与抽象类
纯虚函数是在基类中声明但不实现的虚函数,语法是在函数声明后加
