1、多态的原理
多态之所以可以实现,主要是因为虚函数表的存在,虚函数表用于记录虚函数的地址,他是一个函数指针数组,在类中用一个函数指针数组指针来指向数组,子类继承了父类的虚函数表,当有重写的情况发生时,他就会覆盖掉重写的函数地址。如图所示:
2、单继承和多继承关系中的虚函数表
单继承的虚函数表,以下是类的实现
class Base
{
public:
virtual void func1() { cout << "func1()\n"; }
virtual void func2() { cout << "func2()\n"; }
};
class Derive : virtual public Base
{
virtual void func1() { cout << "func1()\n"; }
virtual void func3() { cout << "func3()\n"; }
virtual void func4() { cout << "func4()\n"; }
};
int main()
{
Base b1;
Derive d1;//各自有各自的虚表父类的虚表继承下来,然后重写的函数地址就覆盖在继承的虚表上,自己的虚表不变
return 0;
}
打开监视窗口会得到 ,继承下来的没有重写的函数,位置相同,虚函数表相同
多继承的虚函数表 (代码实现如下)
class Base1 {
public:
virtual void func1() { cout << "Base1::func1" << endl; }
virtual void func2() { cout << "Base1::func2" << endl; }
private:
int b1;
};
class Base2 {
public:
virtual void func1() { cout << "Base2::func1" << endl; }
virtual void func2() { cout << "Base2::func2" << endl; }
private:
int b2;
};
class Derive : public Base1, public Base2 {
public:
virtual void func1() { cout << "Derive::func1" << endl; }
virtual void func3() { cout << "Derive::func3" << endl; }
private:
int d1;
};
int main()
{
cout << sizeof Derive << endl;//这里是二十因为8+8+4 而子类的函数被放在了第一个虚表的末尾
Derive d;
return 0;
}
可以看打印的东西就知道是8+8+4,其中还有一个函数在第一个虚表的下面。