1.菱形继承(带有虚函数)
(1)派生类未增加新的虚函数
class B
{
public:
virtual void TestFunc1()
{
cout << "B::TestFunc1" << endl;
}
virtual void TestFunc2()
{
cout << "B::TestFunc2" << endl;
}
int _b;
};
class D :virtual public B
{
public:
virtual void TestFunc1()
{
cout << "D::TestFunc1" << endl;
}
int _d;
};
typedef void(*PVTF)();
void Print(B & b, string const& str)
{
cout << str << endl;
PVTF *pVTF = (PVTF*)*(int*)&b;
while (*pVTF)
{
(*pVTF)();
pVTF++;
}
cout << endl;
}
int main()
{
cout << sizeof(D) << endl;
D d;
d._b = 1;
d._d = 2;
Print(d, "D VFT:");
}
结果:
分析:
对象模型和虚函数表:
(2)派生类增加了新的虚函数:
派生类增加了TestFunc3
virtual void TestFunc3()
{ cout << "D::TestFunc3" << endl;
}
主函数:
int main()
{
cout << sizeof(D) << endl;
D d;
d._b = 1;
d._d = 2;
B &b = d;
Print(d, "D VFT:");
Print(b, "D VFT---B:");
}
结果:
分析:
2.菱形虚拟继承(带有虚函数)
class B
{
public:
virtual void TestFunc1()
{
cout << "B::TestFunc1" << endl;
}
virtual void TestFunc2()
{
cout << "B::TestFunc2" << endl;
}
int _b;
};
class C1 :virtual public B
{
public:
virtual void TestFunc1()//重写B中的TestFunc1
{
cout << "C1::TestFunc1" << endl;
}
virtual void TestFunc3()//新增TestFunc3
{
cout << "C1::TestFunc3" << endl;
}
int _c1;
};
class C2 :virtual public B
{
public:
virtual void TestFunc2()//重写B中的TestFunc2
{
cout << "C2::TestFunc2" << endl;
}
virtual void TestFunc4()//新增
{
cout << "C2::TestFunc4" << endl;
}
int _c2;
};
class D :public C1, public C2
{
public:
virtual void TestFunc1()//重写
{
cout << "D::TestFunc1" << endl;
}
virtual void TestFunc3()//重写
{
cout << "D::TestFunc3" << endl;
}
virtual void TestFunc4()//重写
{
cout << "D::TestFunc4" << endl;
}
virtual void TestFunc5()//新增
{
cout << "D::TestFunc5" << endl;
}
int _d;
};
typedef void(*PVTF)();
void Print(B & b, string const& str)
{
cout << str << endl;
PVTF *pVTF = (PVTF*)*(int*)&b;
while (*pVTF)
{
(*pVTF)();
pVTF++;
}
cout << endl;
}
void Print(C1 & b, string const& str)
{
cout << str << endl;
PVTF *pVTF = (PVTF*)*(int*)&b;
while (*pVTF)
{
(*pVTF)();
pVTF++;
}
cout << endl;
}
void Print(C2 & b, string const& str)
{
cout << str << endl;
PVTF *pVTF = (PVTF*)*(int*)&b;
while (*pVTF)
{
(*pVTF)();
pVTF++;
}
cout << endl;
}
int main()
{
D d;
d.C1::_b = 1;
d._c1 = 2;
d._c2 = 3;
d._d = 4;
C1& c1 = d;
C2& c2 = d;
B& b = d;
cout << sizeof(D) << endl;
Print(b, "D VTF--->B");
Print(c1, "D VTF--->C1");
Print(c2, "D VTF--->C2");
return 0;
}
结果:
分析: