c++虚表

本文深入探讨了C++中虚函数表的原理,包括虚表的作用、建立过程及其在对象实例化时如何定位虚函数。通过实例代码解释了虚函数表在类继承中的应用,并对比了不能声明为虚函数的情况,如构造函数、静态函数、内联函数、友元函数和普通函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般生成对象的时候,前四个字节就是虚表的地址。虚表在编译时期就建立了

class Base1 {

public:

    virtual void f() { cout << "Base::f" << endl; }

};

class Base2 {

public:

    void f() { cout << "Base::f" << endl; }

};

class Base {

     public:

            virtual void f() { cout << "Base::f" << endl; }

            virtual void g() { cout << "Base::g" << endl; }

            virtual void h() { cout << "Base::h" << endl; }

 

};

Base1 b1;

Base2 b2;

Base b;

sizeof(b1) 是4

sizeof(b2) ,sizeof(Base2是1,函数不占用空间

sizeof(b) 也是4


typedef void(*Fun)(void);

Base b;

Fun pFun = NULL;

cout << "虚函数表地址:" << (int*)(&b) << endl;

cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;

 

// Invoke the first virtual function 

 pFun = (Fun)*((int*)*(int*)(&b));

(Fun)*((int*)*(int*)(&b)+0);  // Base::f()

(Fun)*((int*)*(int*)(&b)+1);  // Base::g()

(Fun)*((int*)*(int*)(&b)+2);  // Base::h()


c++中不能申明为虚函数的函数有:

1 构造函数 2 静态函数 3 内联函数 4 友元函数 5 普通函数(非类的成员函数)


转载于:https://my.oschina.net/yizhangxyz/blog/634690

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值