虚函数的作用和实现原理
2018-04-02 12:11
225 查看
文章总结自牛客网的评论。
https://www.nowcoder.com/questionTerminal/1f67d4e2b6134c298e993e622181b333
1、虚函数的作用:简单讲即实现多态。 基类定义了虚函数,子类可以重写该函数,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,且这样的函数调用是无法在编译器期间确认的,而是在运行期确认,也叫做迟绑定。2、底层实现原理:先来看看C++对象模型
这个模型从结合上面2中模型的特点,并对内存存取和空间进行了优化。在此模型中,non static 数据成员被放置到对象内部,static数据成员, static and nonstatic 函数成员均被放到对象之外。对于虚函数的支持则分两步完成:
1.每一个class产生一堆指向虚函数的指针,放在表格之中。这个表格称之为虚函数表(virtual table,vtbl)。
2.每一个对象被添加了一个指针,指向相关的虚函数表vtbl。通常这个指针被称为vptr。vptr的设定(setting)和重置(resetting)都由每一个class的构造函数,析构函数和拷贝赋值运算符自动完成。
另外,虚函数表地址的前面设置了一个指向type_info的指针,RTTI(Run Time Type Identification)运行时类型识别是有编译器在编译器生成的特殊类型信息,包括对象继承关系,对象本身的描述,RTTI是为多态而生成的信息,所以只有具有虚函数的对象在会生成
https://www.nowcoder.com/questionTerminal/1f67d4e2b6134c298e993e622181b333
1、虚函数的作用:简单讲即实现多态。 基类定义了虚函数,子类可以重写该函数,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,且这样的函数调用是无法在编译器期间确认的,而是在运行期确认,也叫做迟绑定。2、底层实现原理:先来看看C++对象模型
这个模型从结合上面2中模型的特点,并对内存存取和空间进行了优化。在此模型中,non static 数据成员被放置到对象内部,static数据成员, static and nonstatic 函数成员均被放到对象之外。对于虚函数的支持则分两步完成:
1.每一个class产生一堆指向虚函数的指针,放在表格之中。这个表格称之为虚函数表(virtual table,vtbl)。
2.每一个对象被添加了一个指针,指向相关的虚函数表vtbl。通常这个指针被称为vptr。vptr的设定(setting)和重置(resetting)都由每一个class的构造函数,析构函数和拷贝赋值运算符自动完成。
另外,虚函数表地址的前面设置了一个指向type_info的指针,RTTI(Run Time Type Identification)运行时类型识别是有编译器在编译器生成的特殊类型信息,包括对象继承关系,对象本身的描述,RTTI是为多态而生成的信息,所以只有具有虚函数的对象在会生成
相关文章推荐
- javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析
- 关于函数strtok和strtok_r的使用要点和实现原理
- 关于函数strtok和strtok_r的使用要点和实现原理(一)
- C++的虚函数的实现原理
- FactoryBean的实现原理与作用
- Golang中文字符串截取函数实现原理
- C语言可变参数函数实现原理
- OnPaint()函数的作用原理
- 关于函数strtok和strtok_r的使用要点和实现原理
- 关于函数strtok和strtok_r的使用要点和实现原理(二)
- python装饰器实现原理?一个函数中怎么加入多个装饰器?怎么实现的?
- 虚函数实现原理(转)
- JavaScript作用域原理——作用域根据函数划分
- C++中虚函数实现原理揭秘
- 汇编-------函数传参的实现原理
- 内存动态分配函数malloc的基本实现原理
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- CNN(卷积神经网络)是什么?原理/作用和实现方法。
- printf函数的实现原理
- 几个常见字符串处理函数的实现原理