访问虚函数表+++(菱形继承+多重继承+虚继承)

虚继承除了有虚函数表(vptr)以为,还生成了虚函数表的偏移量(vbptr),大概是这样的
在这里插入图片描述
这里测试了一下多重继承,加菱形继承,加虚继承的代码,并输出了他们的虚函数表,不多bb,看代码看结果吧。
在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>

#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) ((x)<<1)
#define r(x) ((x)<<1|1)
#define lowbit(x) ((x)&(-(x)))
#define abs(x) ((x)>=0?(x):(-(x)))
#define ms(a,b) memset(a,b,sizeof(a))

using namespace std;

class A {
public:
	virtual void getA() {
		cout << "A" << endl;
	}
	virtual void get() {
		cout << "A get" << endl;
	}
};

class B {
public:
	virtual void get() {
		cout << "B get" << endl;
	}
	virtual void getB() {
		cout << "B" << endl;
	}
};

class C : virtual public A, virtual public B {
public:
	virtual void get() {
		cout << "C get" << endl;
	}
	virtual void getC() {
		cout << "C" << endl;
	}
};

class D : virtual public A, virtual public B {
public:
	virtual void get() {
		cout << "D get" << endl;
	}
	virtual void getD() {
		cout << "D" << endl;
	}
};

class Child : virtual public C, virtual public D {
public:
	//Child(){}
	virtual void get() {
		cout << "Child get" << endl;
	}
	virtual void getChild() {
		cout << "Child" << endl;
	}
};

typedef void(*FUNC)();


int main() {
	Child *child = new Child();

	int *vt = (int *)child;

	cout << "表1" << " 偏移量0"<<endl;
	int *fun = (int *)(vt[0]);
	for (int i = 0; i < 1; ++i) {
		printf("function : %d :0X%x->", i, fun[i]);
		FUNC f = (FUNC)fun[i];
		f();
	}
	cout << endl;

	cout << "表2" << " 偏移量2" << endl;
	fun = (int *)(vt[2]);
	for (int i = 0; i<2; ++i) {
		printf("function : %d :0X%x->", i, fun[i]);
		FUNC f = (FUNC)fun[i];
		f();
	}
	cout << endl;

	cout << "表3" << " 偏移量3" << endl;
	fun = (int *)(vt[3]);
	for (int i = 0; i < 2; ++i) {
		printf("function : %d :0X%x->", i, fun[i]);
		FUNC f = (FUNC)fun[i];
		f();
	}
	cout << endl;

	cout << "表4" << " 偏移量4" << endl;
	fun = (int *)(vt[4]);
	for (int i = 0; i < 1; ++i) {
		printf("function : %d :0X%x->", i, fun[i]);
		FUNC f = (FUNC)fun[i];
		f();
	}
	cout << endl;
	

	cout << "表5" << " 偏移量6" << endl;
	fun = (int *)(vt[6]);
	for (int i = 0; i < 1; ++i) {
		printf("function : %d :0X%x->", i, fun[i]);
		FUNC f = (FUNC)fun[i];
		f();
	}
	cout << endl;


	return 0;
}
发布了86 篇原创文章 · 获赞 8 · 访问量 2233

猜你喜欢

转载自blog.csdn.net/Fawkess/article/details/103506698