揭秘C++多态:虚函数背后的魔法

C++多态的核心机制是通过虚函数实现运行时绑定,主要涉及三个关键点:

1. 虚函数重写

  • 基类用virtual声明虚函数,派生类通过override重写实现
class Base {
public:
    virtual void show() { 
        cout << "Base class" << endl; 
    }
};

class Derived : public Base {
public:
    void show() override { 
        cout << "Derived class" << endl; 
    }
};

2. 虚表指针(vptr)

  • 每个含虚函数的类拥有虚函数表(vtable)
  • 对象内存首部隐含vptr指向对应虚表 $$ \text{对象内存布局} = \begin{cases} \text{vptr} & \text{(4/8字节)} \ \text{成员变量} & \text{(按声明顺序)} \end{cases} $$

3. 动态绑定

  • 通过基类指针/引用调用虚函数时:
Base* obj = new Derived();
obj->show();  // 输出"Derived class"
  • 运行时根据vptrvtable→定位实际函数地址

执行过程解析

  1. 编译器为每个类生成vtable $$ \text{Base::vtable} = [ \text{Base::show} ] $$ $$ \text{Derived::vtable} = [ \text{Derived::show} ] $$
  2. new Derived()时构造vptr指向Derived::vtable
  3. obj->show()通过vptr[0]调用函数

此机制实现「同一接口,不同行为」的多态特性,是面向对象的核心设计模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值