获取类中虚函数地址

// CMemory.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <IOSTREAM>
using namespace std;

class Base {
public:
    virtual void f() { cout << "Base::f" << endl; }
    virtual void g() { cout << "Base::g" << endl; }
    virtual void h() { cout << "Base::h" << endl; }
};

class Derive:public Base{
public:
    virtual void f() { cout << "Derive::f" << endl; }
//    virtual void g() { cout << "Derive::g" << endl; }
    virtual void h() { cout << "Derive::h" << endl; }
};

int main(int argc, char* argv[])
{
    typedef void (*Pfunc)(void);
    Base b;
    cout<<"vptr addr: "<<(int *)&b<<endl;
    cout<<"first func addr: "<<(int *)(*(int *)&b+0)<<endl;
    cout<<"second func addr: "<<(int *)(*(int *)&b)+1<<endl;
    cout<<"third func addr: "<<(int *)(*(int *)&b)+2<<endl;

    Pfunc funcf = (Pfunc)*((int *)(*(int *)&b)+0);
    Pfunc funcg = (Pfunc)*((int *)(*(int *)&b)+1);
    Pfunc funch = (Pfunc)*((int *)(*(int *)&b)+2);
    funcf();
    funcg();
    funch();

    Derive d ;
    cout<<"vptr addr: "<<(int *)&d<<endl;
    cout<<"first func addr: "<<(int *)(*(int *)&d+0)<<endl;
    cout<<"second func addr: "<<(int *)(*(int *)&d)+1<<endl;
    cout<<"third func addr: "<<(int *)(*(int *)&d)+2<<endl;

    Pfunc dfuncf = (Pfunc)*((int *)(*(int *)&d)+0);
    Pfunc dfuncg = (Pfunc)*((int *)(*(int *)&d)+1);
    Pfunc dfunch = (Pfunc)*((int *)(*(int *)&d)+2);
    dfuncf();
    dfuncg();
    dfunch();
  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  //多继承时继承类拥有n个虚函数表,继承了n各类
    int    ** pVtab = (int**)&d;            //二维数组,第一维:第几个虚函数表,第二维:虚函数表中第几个虚函数
    Pfunc dd = (Pfunc)pVtab[0][0];
    dd();
    return 0;
}
时间: 2024-11-07 03:19:48

获取类中虚函数地址的相关文章

获取C++虚表地址和虚函数地址

获取C++虚表地址和虚函数地址 By qianghaohao 学过C++的应该都对虚表有所耳闻,在此就不过多介绍概念了,通过实 例来演示一下如何获取虚表地址和虚函数地址. 简单说一下虚表的概念:在一个类中如果有虚函数,那么此类的实例中就有 一个虚表指针指向虚表,这个虚表是一块儿专门存放类的虚函数地址的内存. 图示说明本文的主题(先看图更容易后面代码中的指针操作): 代码如下(要讲解的都在代码的注释中说明了): class Base { public: virtual void f() { cou

C++中虚函数工作原理和(虚)继承类…

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式.vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl.当

C++中虚函数实现原理揭秘

编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟.      编译器对每个包含虚函数的类创建一个表(称为V TA B L E).在V TA B L E中,编译器放置特定类的虚函数地址.在每个带有虚函数的类 中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E.通过基类指针做虚函数调 用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使

C++中虚函数工作原理

一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式.vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl.当一个对象调用了虚函数,实际的被调用函数通过下面的步骤确定:找到对象的 vptr 指向的 vtbl,然后在 vtbl 中寻找合适的函数指针. 

面向对象程序设计——概述,定义基类和派生类,虚函数

一.OOP:概述 面向对象程序设计的核心思想是数据抽象.继承和动态绑定.通过使用数据抽象,我们可以将类的接口和实现分离:使用继承,可以定义相似的类型并对其相似关系建模:使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象. 1)继承 通过继承联系在一起的类构成一种层次关系.通常在层次关系的根部有一个基类,其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类.基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自的成员. 在C++语言中,基类将类型相

C++中虚函数工作原理和(虚)继承类的内存占用大小计算

一.虚继承情况下类的内存大小计算 当每个基类中有多个虚函数时,并且在虚继承的情况下,内存是如何分配的,如何计算类的大小,下面举例说明: #include<iostream> using namespace std; class A { public: int a; virtual void aa(){}; }; class D { public: virtual void dd(){}; }; class C { public: virtual void cc(){}; }; class B

派生表中第一个基类没有虚函数,派生类存在虚函数时的内存布局

单继承的例子: #include <iostream> using namespace std; class A { public: A() { a = 1; ch = 'a'; //ASCII码97 } private: int a; char ch; }; class C : public A { public: C() { c = 3; } virtual void print() { cout << "C" << endl; } privat

c++中虚函数和纯虚函数定义

只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数. 根据什么考虑是否把一个成员函数声明为虚函数? ①  看成员函数所在的类是否会作为基类 ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该

C++中虚函数

本文为博主学习虚函数时,结合网上博客和相关书籍所写.主要分为两部分:虚函数的定义要遵循的规则,虚函数表. 一.虚函数的定义要遵循的规则 1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的. 解读:派生类中根据需要对虚函数进行重定义是,格式要求有三点: (1)与基类的虚函数有相同的参数个数: (2)与基类的虚函数有相同的参数类型: (3)与基类的虚函数有相同的返回类型:或者与基类虚函数的相同,或者都返回