多重继承
继承关系大于2,至少有父类,子类,孙子类三代关系。
class A
{
public:
A(int a1 = 0, int a2 = 0) {};
~A() {};
virtual void A1() { cout << "A::A1() " << endl; };
virtual void A2() { cout << "A::A2() " << endl; };
virtual void A3() { cout << "A::A3() " << endl; };
protected:
int a1;
int a2;
};
class B : public A
{
public:
B(int a1 = 0, int a2 = 0, int b1 = 0) {};
~B() {};
virtual void B1() { cout << "B::B1() " << endl; };
virtual void B2() { cout << "B::B2() " << endl; };
virtual void A1() { cout << "B::A1() " << endl; };
protected:
int b1;
};
class C : public B
{
public:
C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
~C() {};
virtual void C1() { cout << "C::C1() " << endl; };
virtual void B2() { cout << "C::B2() " << endl; };
virtual void A1() { cout << "C::A1() " << endl; };
protected:
int c1;
};
使用VS2017查看对象内存布局如下:
class C size(20):
+---
0 | +--- (base class B)
0 | | +--- (base class A)
0 | | | {vfptr}
4 | | | a1
8 | | | a2
| | +---
12 | | b1
| +---
16 | c1
+---
C::$vftable@:
| &C_meta
| 0
0 | &C::A1
1 | &A::A2
2 | &A::A3
3 | &B::B1
4 | &C::B2
5 | &C::C1
实例验证:
#include <iostream>
using namespace std;
class A
{
public:
A(int a1 = 0, int a2 = 0) {};
~A() {};
virtual void A1() { cout << "A::A1() " << endl; };
virtual void A2() { cout << "A::A2() " << endl; };
virtual void A3() { cout << "A::A3() " << endl; };
protected:
int a1;
int a2;
};
class B : public A
{
public:
B(int a1 = 0, int a2 = 0, int b1 = 0) {};
~B() {};
virtual void B1() { cout << "B::B1() " << endl; };
virtual void B2() { cout << "B::B2() " << endl; };
virtual void A1() { cout << "B::A1() " << endl; };
protected:
int b1;
};
class C : public B
{
public:
C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
~C() {};
virtual void C1() { cout << "C::C1() " << endl; };
virtual void B2() { cout << "C::B2() " << endl; };
virtual void A1() { cout << "C::A1() " << endl; };
protected:
int c1;
};
typedef void(*pfun)(); //函数指针
int main()
{
C *bp = new C;
pfun fun = NULL;
for (size_t i = 0; i < 6; i++)
{
fun = (pfun)*((long *)*(long*)bp + i);
fun();
}
cout << *((long *)*(long*)bp + 5) << endl;
system("PAUSE");
}
运行结果:
C::A1()
A::A2()
A::A3()
B::B1()
C::B2()
C::C1()
1512644
请按任意键继续. . .
与对象内存布局图一致。
多继承
一个子类的父类不止一个,定义三个类
class A
{
public:
A(int a1 = 0, int a2 = 0) {};
~A() {};
virtual void A1() { cout << "A::A1() " << endl; };
virtual void A2() { cout << "A::A2() " << endl; };
virtual void A3() { cout << "A::A3() " << endl; };
protected:
int a1;
int a2;
};
class B
{
public:
B(int b1 = 0) {};
~B() {};
virtual void B1() { cout << "B::B1() " << endl; };
virtual void B2() { cout << "B::B2() " << endl; };
protected:
int b1;
};
class C : public A, public B
{
public:
C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
~C() {};
virtual void C1() { cout << "C::C1() " << endl; };
virtual void B1() { cout << "C::B1() " << endl; };
virtual void A1() { cout << "C::A1() " << endl; };
protected:
int c1;
};
class C size(24):
+---
0 | +--- (base class A)
0 | | {vfptr}
4 | | a1
8 | | a2
| +---
12 | +--- (base class B)
12 | | {vfptr}
16 | | b1
| +---
20 | c1
+---
C::$vftable@A@:
| &C_meta
| 0
0 | &C::A1
1 | &A::A2
2 | &A::A3
3 | &C::C1
C::$vftable@B@:
| -12
0 | &C::B1
1 | &B::B2
多继承的内存布局与单继承和多重继承不一样,子类继承一个父类,子类就有一个虚函数表,当子类继承两个父类时,子类就有两个虚函数表,而且子类自己定义的虚函数放在第一个继承的虚函数表中。
实例验证:
#include <iostream>
using namespace std;
class A
{
public:
A(int a1 = 0, int a2 = 0) {};
~A() {};
virtual void A1() { cout << "A::A1() " << endl; };
virtual void A2() { cout << "A::A2() " << endl; };
virtual void A3() { cout << "A::A3() " << endl; };
protected:
int a1;
int a2;
};
class B
{
public:
B(int b1 = 0) {};
~B() {};
virtual void B1() { cout << "B::B1() " << endl; };
virtual void B2() { cout << "B::B2() " << endl; };
protected:
int b1;
};
class C : public A, public B
{
public:
C(int a1 = 0, int a2 = 0, int b1 = 0, int c1 = 0) {};
~C() {};
virtual void C1() { cout << "C::C1() " << endl; };
virtual void B1() { cout << "C::B1() " << endl; };
virtual void A1() { cout << "C::A1() " << endl; };
protected:
int c1;
};
typedef void(*pfun)(); //函数指针
int main()
{
C *bp = new C;
pfun fun = NULL;
cout << "A的虚函数表" << endl;
for (size_t i = 0; i < 4; i++)
{
fun = (pfun)*((long *)*(long*)bp + i);
fun();
}
cout << "B的虚函数表" << endl;
long* cp = (long*)bp + 3;
for (size_t i = 0; i < 2; i++)
{
fun = (pfun)*((long *)*(long*)cp + i);
fun();
}
cout << *((long *)*cp + 2) << endl;
system("PAUSE");
}
运行结果:
A的虚函数表
C::A1()
A::A2()
A::A3()
C::C1()
B的虚函数表
C::B1()
B::B2()
0
请按任意键继续. . .
与对象内存布局图一致。