参考代码
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;
}
运行结果
