C语言中虚函数和虚表是如何实现多态性的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1834个文字,预计阅读时间需要8分钟。
面向对象,从单一的类型开始说起。
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分钟。
面向对象,从单一的类型开始说起。
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指针就能找到对应的数据,通过这同一段代码来处理不同的数据。

