代码如下:
cpp
#include<iostream>
class Base
{
public:
Base(int i) :baseI(i) {};
int getI() { return baseI; }
static void countI() {};
virtual void print(void) { std::cout << "Base::print()"; }
virtual void printFun(void) { std::cout << "Base::printFun()"; }
virtual ~Base() {}
private:
int baseI;
static int baseS;
};
class Derive : public Base
{
public:
Derive(int d) :Base(1000), DeriveI(d) {};
//overwrite父类虚函数
virtual void printFun(void) { std::cout << "Drive::printFun()"; }
// Derive声明的新的虚函数
virtual void printBeforeDestructor() { std::cout << "Drive::printBeforeDestructor()"; }
virtual ~Derive() {}
virtual void printAfterDestructor() { std::cout << "Drive::printAfterDestructor()"; }
private:
int DeriveI;
};
typedef void(*Fun)(void);
int main()
{
Derive d(2000);
//[0]
std::cout << "[0]Base::vptr";
std::cout << "\t地址:" << (int *)(&d) << std::endl;
//vprt[0]
std::cout << " [0]";
Fun fun0 = (Fun)*((int *)*((int *)(&d)));
fun0();
std::cout << "\t地址:\t" << *((int *)*((int *)(&d))) << std::endl;
//vprt[1]
std::cout << " [1]";
Fun fun1 = (Fun)*((int *)*((int *)(&d)) + 1);
fun1();
std::cout << "\t地址:\t" << *((int *)*((int *)(&d)) + 1) << std::endl;
//vprt[2]析构函数无法通过地址调用,故手动输出
std::cout << " [2]" << "Derive::~Derive()" << std::endl;
//vprt[3]
std::cout << " [3]";
Fun fun3 = (Fun)*((int *)*((int *)(&d)) + 3);
fun3();
std::cout << "\t地址:\t" << *((int *)*((int *)(&d)) + 3) << std::endl;
//vprt[4]
std::cout << " [4]";
Fun fun4 = (Fun)*((int *)*((int *)(&d)) + 4);
fun4();
std::cout << "\t地址:\t" << *((int *)*((int *)(&d)) + 4) << std::endl;
//[1]
std::cout << "[1]Base::baseI=" << *(int*)((int *)(&d) + 1);
std::cout << "\t地址:" << (int *)(&d) + 1;
std::cout << std::endl;
//[2]
std::cout << "[2]Derive::DeriveI=" << *(int*)((int *)(&d) + 2);
std::cout << "\t地址:" << (int *)(&d) + 2;
std::cout << std::endl;
return 0;
}
验证结果如下:

参考文章
图说C++对象模型:对象内存布局详解