C++ 虚表指针Vptr与虚函数表Vtable

本文介绍了C++中虚函数的概念,包括静态绑定与动态绑定的区别,以及虚函数如何实现动态多态。讨论了虚函数表(Vtable)和虚表指针(Vptr)的原理,详细解析了单继承、多继承及虚继承的虚函数表结构。同时,阐述了纯虚函数、虚析构函数的重要性,以及为什么构造函数通常不应声明为虚函数。
摘要由CSDN通过智能技术生成

面向对象语言的三大特性:继承、封装、多态

其中多态的含义是同一方法的具体执行与实际调用者上下文环境密切有关。


绑定是函数调用者与具体函数入口的关联,即如何定位到函数的执行地址

  • 静态绑定:也称为编译期绑定,在程序没有运行前,就可将函数调用与具体执行代码关联
  • 动态绑定:在实际运行期,判断引用对象的实际调用的方法

静态多态与动态多态

  • 静态多态:主要通过重载与模板实现,其在编译期就可以确定实际的调用地址
  • 动态多态:主要依靠虚函数来实现,不同的编译器其虚函数实现原理不同

 

虚函数的基本使用方法:

在基类的成员函数前方加virtual关键字,即该函数为虚函数,派生类重写该函数默认也为虚函数

 

首先查看不加virtual关键字,派生类重写基类成员函数的情况。

class Worker {
public:
    virtual ~Worker() {}
    void DoMyWork() {
        cout << "Base" << endl;
    }
};
class PMer :public Worker {
public:
  
    void DoMyWork() {
        cout << "ChildPMer" << endl;
    }
};
class RDer :public Worker {
public:
 
    void DoMyWork() {
        cout << "ChildRDer" << endl;
    }
};
int main() {
    //使用基类指针访问派生类
    Worker* ptr_pm = new PMer();
    Worker* ptr_rd = new RDer();
    cout << "#### use ptr #####" << endl;
    ptr_pm->DoMyWork();
    ptr_rd->DoMyWork();
    ptr_pm->Worker::DoMyWork();
    cout << "-----------------------------" << endl;
    //使用基类引用访问派生类
    PMer pmins;
    RDer rdins;
    Worker& ref_pm = pmins;
    Worker& ref_rd = rdins;
    cout << "#### use ref #####" <&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值