C++进阶:多态(下)

1、多态的原理

        多态之所以可以实现,主要是因为虚函数表的存在,虚函数表用于记录虚函数的地址,他是一个函数指针数组,在类中用一个函数指针数组指针来指向数组,子类继承了父类的虚函数表,当有重写的情况发生时,他就会覆盖掉重写的函数地址。如图所示:

        C++进阶:多态(下)_第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;
}

打开监视窗口会得到 ,继承下来的没有重写的函数,位置相同,虚函数表相同C++进阶:多态(下)_第2张图片

        多继承的虚函数表 (代码实现如下)

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,其中还有一个函数在第一个虚表的下面。

你可能感兴趣的:(c++,开发语言)