上篇聊了继承,今天讲继承的"灵魂搭档"——多态。
多态是面向对象三大特性里最"高级"的一个。面试的时候,如果候选人能把多态讲清楚,特别是虚函数的底层实现,我基本就认定这个人的C++功底没问题。
讲个面试场景。
面试官问:"什么是多态?"
大部分人说:"同一个接口,不同的行为。"
面试官追问:"底层怎么实现的?"
很多人就开始含糊了:"虚函数……虚表……具体不太记得了。"
今天把多态和虚函数从表层到深层一次讲透。
没有多态的世界
先看看没有多态会怎样。假设你有激光雷达、相机、IMU三种传感器,每种都有init()操作。你要写一个函数初始化所有传感器,问题来了——三种类型不一样,没法放在同一个容器里用统一的接口调用。
这就是多态要解决的问题——让不同类型的对象,通过统一的接口来操作。
虚函数:多态的关键
实现多态,需要一个基类和虚函数:
class Sensor { public: virtual void init() { cout << "Initializing base sensor..." << endl; } }; class LidarSensor : public Sensor { public: void init() override { cout << "Initializing lidar..." << endl; } }; class CameraSensor : public Sensor { publ