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

运行结果

相关推荐
一木 之林4 分钟前
C/C++ 面向对象编程(OOP)(进阶)
java·c语言·c++
sel_96 分钟前
【vLLM】vLLM 推理框架详解:从 PagedAttention 到生产级部署实战
人工智能·深度学习·算法·语言模型·框架·vllm
XR12345678826 分钟前
办公大楼组网选型决策树:TCO 与三大品牌优劣对比总结
算法·决策树·机器学习
阳明山水42 分钟前
Mamba路径如何建模长程时序依赖
人工智能·深度学习·算法·机器学习·架构
mayaairi43 分钟前
JS BOM完全指南(二):事件轮询、三大尺寸家族与浏览器对象详解
开发语言·javascript·ecmascript
technology_x1 小时前
液冷超充站设备厂家哪家好?2026年功率与散热对比
java·开发语言
SurpriseDPD1 小时前
bpftrace‑tasks 工具代码分析
开发语言·python
千谦阙听1 小时前
C++篇:类和对象(上)
开发语言·c++
许彰午1 小时前
07-SqlBuilder六法
java·开发语言·低代码·架构
BS30813_vx1 小时前
【编号:01652】Spring Boot村务管理系统:财务公开、党建活动与计生服务一体化实战
开发语言·python