C++覆盖(虚函数的实现原理)
来源:互联网 发布:淘宝店铺怎么关注链接 编辑:程序博客网 时间:2024/06/05 01:57
Class Shape{public: virtual void cal_area() { }private: int m_ir;};Class Circle:public Shape{public: virtual void cal_area() { }};
类Circle继承类Shape
当用Shape类实例化一个指针对象,并
Shape *shape=new Circle;
此时的虚函数是如何实现的呢?
当实例化一个Shape对象时,除了生成数据成员,还会生成一个虚函数表指针成员,这个虚函数表指针与虚函数表同时出现,虚函数表只有一个,而虚函数表指针指向虚函数表的首地址,在虚函数表中定义了一个函数指针,这个函数指针指向了计算面积函数的首地址,当在主函数中调用了计算面积的函数时,编译器通过虚函数表指针找到虚函数表,再在虚函数表中找到指向计算面积函数的指针,通过这个指针找到函数的入口地址,从而调用虚函数。
当派生类Circle中没有同名的计算面积函数时,在实例化Circle的时候也会生成虚函数表指针和一个虚函数表,而虚函数表中也有一个指向计算面积函数的指针,这个指针是从它的基类中继承来的,所以当在主函数中调用计算面积函数时,可以调用基类中所定义的计算面积函数。
当派生类Circle中定义了同名的计算面积函数时(无论它前面有没有virtual修饰,只要基类中的同名函数被virtual修饰,那么编译器会自动给派生类中的同名函数加上virtual前缀),实例化Circle的时候也会生成虚函数表指针和一个虚函数表,而虚函数表中也有一个指向计算面积函数的指针,这个指针一开始的值是从基类继承而来,但在实例化Circle之后,这个值就会被Circle类中定义的计算面积函数的首地址所覆盖。
这就是C++中的覆盖的定义,要与隐藏区分开来。
0 0
- C++覆盖(虚函数的实现原理)
- 纯C环境下实现标准函数的覆盖
- C++/CLI的函数覆盖
- C++ 多态的实现原理--虚函数表
- thinkphp C函数的实现原理
- 虚函数的实现原理
- c++(成员函数的)重载、覆盖与隐藏
- 【C++】成员函数的重载,覆盖,隐藏
- 【C++】对象函数的覆盖、重载、多态
- C 语言实现多态的原理:函数指针
- C打印函数printf的一种实现原理简要分析
- C语言可变参函数的实现原理浅析
- 转载 C 函数的可变参数实现原理
- 【C++】虚函数原理
- C++的虚函数的实现原理
- 【C++】子类在重写虚函数时,会覆盖父类的函数
- C++虚函数的原理及实现
- C++虚函数的原理及实现
- dp1.1
- HTML5 data-* 自定义属性
- 1619-7 张良 十月十四号总结 [连续第十四天]
- 小目标
- 217. Contains Duplicate
- C++覆盖(虚函数的实现原理)
- 练习Linux中的vi编辑器
- Android入门第十二篇之Gallery
- 简单DP 总结
- strstr(str1,str2)函数使用时注意事项
- 前端常用的正则表达式大全
- orcale 11G 闪回查询误删数据
- Swift2.3 --> Swift3.0 的变化
- 题目1434:今年暑假不AC[贪心算法]