C++ 抽象类与多态原理:从纯虚函数到虚表机制
前言
在 C++ 多态体系中,纯虚函数与抽象类是实现'接口规范'的核心工具,而虚函数表(vtable)与虚表指针(vfptr)则是多态底层实现的关键。本文将基于实战代码,从纯虚函数与抽象类的定义、使用场景入手,逐步拆解多态的底层原理——包括虚表指针的存在性、虚函数表的结构与存储位置,最终帮你打通'多态怎么用'到'多态如何实现'的认知链路。
一、纯虚函数与抽象类:强制接口规范的'契约'
在实际开发中,我们经常需要定义一个'只规定行为,不提供具体实现'的类。C++ 通过纯虚函数和抽象类实现这种'接口契约'。
1.1 纯虚函数:没有实现的'接口声明'
在虚函数的声明后加=0,该函数即为纯虚函数。纯虚函数无需在基类中实现(语法上允许实现,但无实际意义,因为会被派生类重写),其核心作用是'强制派生类必须重写该函数'。
1.2 抽象类:包含纯虚函数的'不可实例化类'
包含纯虚函数的类称为抽象类,它有两个关键特性:
- 无法直接实例化对象(编译器会报错);
- 派生类若未重写基类的所有纯虚函数,自身也会成为抽象类,同样无法实例化。
有了上面的知识储备,我们来看下代码示例吧:
#include <iostream>
using namespace std;
// 抽象类:包含纯虚函数 Drive()
class Car {
public:
// 纯虚函数:只声明接口,不提供实现
virtual void Drive() = 0;
};
// 派生类 Benz:重写纯虚函数,成为'具体类'
class Benz : public Car {
public:
// 必须重写 Drive(),否则 Benz 也是抽象类
virtual void Drive() {
cout << "Benz-舒适" << endl;
}
};
// 派生类 BMW:重写纯虚函数,成为'具体类'
class BMW : public Car {
public:
{
cout << << endl;
}
};
{
Car* pBenz = Benz;
pBenz->();
Car* pBMW = BMW;
pBMW->();
pBenz;
pBMW;
;
}


