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;
}

打开监视窗口会得到 ,继承下来的没有重写的函数,位置相同,虚函数表相同

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

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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-24 01:40:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-24 01:40:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-24 01:40:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-24 01:40:07       20 阅读

热门阅读

  1. OWASP ZAP:下一代网络安全的瑞士军刀

    2024-01-24 01:40:07       38 阅读
  2. OpenGL缓冲对象 Buffer Objects

    2024-01-24 01:40:07       37 阅读
  3. 2-项目介绍

    2024-01-24 01:40:07       23 阅读
  4. 【无标题】

    2024-01-24 01:40:07       37 阅读
  5. IDEA 常用快捷键

    2024-01-24 01:40:07       40 阅读
  6. JVM—垃圾回收

    2024-01-24 01:40:07       26 阅读
  7. 【每日一词】服务假死

    2024-01-24 01:40:07       43 阅读
  8. seafile+onlyoffice集成部署

    2024-01-24 01:40:07       37 阅读
  9. 一文读懂 c++ 容器

    2024-01-24 01:40:07       34 阅读
  10. 【使用vue-cli构建项目详细介绍】

    2024-01-24 01:40:07       40 阅读