C++ 多态与虚函数表(一)—— 单继承

一、前言

个人笔记,不保证严谨和正确☺,如有错误还望指出!

《C++ 多态与虚函数表(一)—— 单继承》

《C++ 多态与虚函数表(二)—— 多继承》

《C++ 多态与虚函数表(三)—— 重复继承》

《C++ 多态与虚函数表(四)—— 虚继承》

《C++ 多态与虚函数表(五)拓展—— 对象大小》

 

二、取地址

class Base
{
public:
    long long value;
    virtual f();
};
typedef void(*ptrType)(void);
Base b;
cout << "虚函数表地址:" << (ptrType*)(&b) << endl;
cout << "虚函数表 — 第一个函数地址:" << (ptrType*)*(ptrType*)(&b) << endl;

// 方法一
ptrType* pHead = (ptrType*)(&b);        // pHead: 指向的是类空间首地址(即,虚函数表地址)
ptrType* pVptr = (ptrType*)(*pHead);    // pVptr: 虚函数表第一个函数地址

ptrType F = (ptrType)*(pVptr+i);        // 取第i+1个虚函数指针, Base::f()
F(); // i = 0, 执行第1个虚函数 Base::f()
long long value = *(long long *)(pHead + 1);    // Base::value

// 方法二
ptrType** pVtab = (ptrType**)&b;           // pVtab[0] 内存布局首地址,如有虚指针为虚
ptrType F = (ptrType)pVtab[0][0];          // 取第1个虚函数指针, Base::f()
long long value = (long long)*(&pVtab[1];  // Base::value

 

三、含有虚函数的基类

3.1 基类定义

class Parent 
{
public:
    long long iparent;
    Parent ():iparent (10) {}
    virtual void f() { cout << "Parent::f()" << endl; }
    virtual void g() { cout << "Parent::g()" << endl; }
    virtual void h() { cout << "Parent::h()" << endl; }
};

3.2 类图和内存布局

类图

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值