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

运行结果

相关推荐
思无邪662 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
灯澜忆梦2 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下2 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J3 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛3 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有3 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111113 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS4 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b4 小时前
算法日常・每日刷题--<动态规划>14
算法
零基础1234 小时前
Ubuntu 常用命令汇总
linux·运维·开发语言