C语言中虚函数和虚表是如何实现多态性的?

2026-04-19 05:360阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1834个文字,预计阅读时间需要8分钟。

C语言中虚函数和虚表是如何实现多态性的?

面向对象,从单一的类型开始说起。

class A { private: int m_a; int m_b;}

这个类中有两个成员变量,都是int类型。因此,这个类在内存中占用的空间取决于int类型的大小。

sizeof(A),8个字节,一个int占用4个字节。

面向对象,从单一的类开始说起。

classA { private: intm_a; intm_b; };

这个类中有两个成员变量,都是int类型,所以这个类在内存中占用多大的内存空间呢?

sizeof(A), 8个字节,一个int占用四个字节。下图验证:

这两个数据在内存中是怎样排列的呢?

原来是这样,我们根据debug出来的地址画出a对象在内存的结构图

如果class A中包含成员函数呢? A 的大小又是多少?

classA { public: voidfunc1(){} private: intm_a; intm_b; };

直接告诉你答案,类的成员函数多大? 没人能回答你,并且不是本文的重点,类的成员函数是放在代码区的,不算在类的大小内。

类的对象共享这一段代码,试想,如果每一个对象都有一段代码,光是存储这些代码得占用多少空间?所以同一个类的对象共用一段代码。

共用同一段代码怎么区分不同的对象呢?

实际上,你在调用成员函数时,a.func1()会被编译器翻译为A::func1(&a),也就是A* const this, this 就是 a 对象的地址。

所以根据this指针就能找到对应的数据,通过这同一段代码来处理不同的数据。

阅读全文

本文共计1834个文字,预计阅读时间需要8分钟。

C语言中虚函数和虚表是如何实现多态性的?

面向对象,从单一的类型开始说起。

class A { private: int m_a; int m_b;}

这个类中有两个成员变量,都是int类型。因此,这个类在内存中占用的空间取决于int类型的大小。

sizeof(A),8个字节,一个int占用4个字节。

面向对象,从单一的类开始说起。

classA { private: intm_a; intm_b; };

这个类中有两个成员变量,都是int类型,所以这个类在内存中占用多大的内存空间呢?

sizeof(A), 8个字节,一个int占用四个字节。下图验证:

这两个数据在内存中是怎样排列的呢?

原来是这样,我们根据debug出来的地址画出a对象在内存的结构图

如果class A中包含成员函数呢? A 的大小又是多少?

classA { public: voidfunc1(){} private: intm_a; intm_b; };

直接告诉你答案,类的成员函数多大? 没人能回答你,并且不是本文的重点,类的成员函数是放在代码区的,不算在类的大小内。

类的对象共享这一段代码,试想,如果每一个对象都有一段代码,光是存储这些代码得占用多少空间?所以同一个类的对象共用一段代码。

共用同一段代码怎么区分不同的对象呢?

实际上,你在调用成员函数时,a.func1()会被编译器翻译为A::func1(&a),也就是A* const this, this 就是 a 对象的地址。

所以根据this指针就能找到对应的数据,通过这同一段代码来处理不同的数据。

阅读全文