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

运行结果

相关推荐
Lumos1867 小时前
51单片机从零到实战(8)——串口通信
算法
sycmancia8 小时前
Qt——另一种创建线程的方式
开发语言·qt
小帽子_1238 小时前
大功率 PCS 双环闭环控制算法原理与实现
算法
你怎么知道我是队长8 小时前
JavaScript 函数 this 全解
开发语言·javascript·ecmascript
L-影8 小时前
单体项目结构
java·开发语言
buhuizhiyuci9 小时前
【算法篇】位运算 —— 基础篇
java·数据库·算法
Black蜡笔小新9 小时前
算法训练完了怎么上线?DLTM→AIS→EasyGBS三步交付流水线
人工智能·算法
孬甭_9 小时前
C++ string类
开发语言·c++
Python图像识别-19 小时前
基于yolov8的钢铁缺陷检测系统-2027毕业版(UI界面+Python项目源码+模型+标注好的数据集)
开发语言·python·yolo