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;
}

运行结果

相关推荐
科学实验家18 小时前
dp子序列问题,好难呀
算法
黄贵根1 天前
JavaScript实现教培行业意向登记系统
开发语言·javascript·ecmascript
2401_868534781 天前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
zzzll11111 天前
Claude Code离线安装方案揭秘
开发语言·php
wabs6661 天前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing1 天前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
wling03011 天前
vasp虚频计算-python脚本
开发语言·windows·python·vasp计算
郝学胜-神的一滴1 天前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi20261 天前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog1 天前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法