C++类之虚函数表没有虚继承的菱形继承

参考代码

cpp 复制代码
#include<iostream>
class A {

public:
	A(int _a) { a = _a; std::cout << "A::A()\r\n"; }
	virtual void fun() { std::cout << "virtual void A::fun()\r\n"; }
	virtual void funA() { std::cout << "virtual void A::funA()\r\n"; }
	virtual void funAA() { std::cout << "virtual void A::funAA()\r\n"; }
	virtual ~A() { std::cout << "virtual A::~A()\r\n"; }

private:
	int a;
};

class B: public A{

public:
	B(int _b): A(555) { b = _b; std::cout << "B::B()\r\n"; }
	virtual void fun() { std::cout << "virtual void B::fun()\r\n"; }
	virtual void funB() { std::cout << "virtual void B::funB()\r\n"; }
	virtual void funBB() { std::cout << "virtual void B::funBB()\r\n"; }
	virtual ~B() { std::cout << "virtual B::~B()\r\n"; }

private:
	int b;
};

class C : public A {

public:
	C(int _c) : A(666) { c = _c; std::cout << "C::C()\r\n"; }
	virtual void fun() { std::cout << "virtual void C::fun()\r\n"; }
	virtual void funC() { std::cout << "virtual void C::funC()\r\n"; }
	virtual void funCC() { std::cout << "virtual void C::funCC()\r\n"; }
	virtual ~C() { std::cout << "virtual C::~C()\r\n"; }

private:
	int c;
};

class D : public B, public C {

public:
	D(int _d) : B(777), C(888) { d = _d; std::cout << "D::D()\r\n"; }
	virtual void fun() { std::cout << "virtual void D::fun()\r\n"; }
	virtual void funD() { std::cout << "virtual void D::funD()\r\n"; }
	virtual void funDD() { std::cout << "virtual void D::funDD()\r\n"; }
	virtual ~D() { std::cout << "virtual D::~D()\r\n"; }

private:
	int d;
};

int main()
{
	D obj{444};
	std::cout << "sizeof(obj): " << sizeof(obj) << "\r\n";
	for (int i = 0; i < 7; ++i) {
		std::cout << ((int*)(&obj) + i) << "\t" << *((int*)(&obj) + i) << "\r\n";
	}

	typedef void(*Fun)();
	Fun pF1 = nullptr;

	std::cout << "(int*)*((int*)(&obj) + 0) + a[i]\r\n";
	int a[] = { 0,1,2,3,4,5,6,7 };
	for (int i = 0; i < sizeof(a) / sizeof(int); ++i) {
		if (a[i] == 3) {
			std::cout << ((int*)*((int*)(&obj) + 0) + a[i]) << "\t这里应该是virtual D::~D()\r\n";
		}
		else {
			std::cout << ((int*)*((int*)(&obj) + 0) + a[i]) << "\t";
			pF1 = (Fun)*((int*)*((int*)(&obj) + 0) + a[i]);
			pF1();
		}
	}

	std::cout << "(int*)*((int*)(&obj) + 3) + b[i]\r\n";
	int b[] = { 0,1,2,3,4,5 };
	for (int i = 0; i < sizeof(b) / sizeof(int); ++i) {
		if (b[i] == 3) {
			std::cout << ((int*)*((int*)(&obj) + 3) + b[i]) << "\t这里应该是virtual D::~D()\r\n";
		}
		else {
			std::cout << ((int*)*((int*)(&obj) + 3) + b[i]) << "\t";
			pF1 = (Fun)*((int*)*((int*)(&obj) + 3) + b[i]);
			pF1();
		}
	}
	return 0;
}

运行结果

相关推荐
小咕聊编程6 小时前
基于Python的豆瓣电影数据可视化系统构建分析
开发语言·python·信息可视化
WBluuue7 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
脏脏a8 小时前
延迟与画质:远程控制的生命线
开发语言·php
澳鹏Appen8 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
像风一样的男人@8 小时前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤8 小时前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
必须得开心呀8 小时前
字节序大小端科普
c++·程序人生
benjormin8 小时前
Java数据结构 二叉搜索树
数据结构·算法
m0_639906948 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
Evand J8 小时前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa