C++构造函数与虚表覆盖
2016-04-20 09:03
302 查看
在涉及到虚函数的情况下,C++构造函数的构造顺序为:先调用构造函数,虚表指针初始化,用户代码;如涉及到多重继承情况,初始化顺序为基类、子类(从左至右),假设一个类的继承情况如下图,其初始化顺序为:Point,Point3d,Vertex,Vertex3d,PVertex,而这样的调用顺序说明在构造函数中调用虚函数是安全的,即时在初始化列表中基类构造函数在用户函数后面,g++编译器亦会自动调整。
我们假设上述类的虚函数中设计到虚函数(析构函数未计算)如上图所示,虚函数中出现了重载,子类中选择性重载虚函数,虚函数与重载就会出现:重载优先级高于虚函数的情况。PVertex类中只实现z(int)函数的情况下:
此时PVertex并不调用V::z(float),PVertex::z(int)覆盖了函数Vertex::z(float),覆盖解决方法还是在PVertex中加入声明: using Vertex3d::z。
我们假设上述类的虚函数中设计到虚函数(析构函数未计算)如上图所示,虚函数中出现了重载,子类中选择性重载虚函数,虚函数与重载就会出现:重载优先级高于虚函数的情况。PVertex类中只实现z(int)函数的情况下:
PVertex vertex(3); Vertex3d *p = &vertex; Vertex *q = &vertex; PVertex *p1 = &vertex; cout << "call z function:" << endl; p1->z(0.1f);
输出结果如下:
Point::Point() Point3d::Point3d() Vertex::Vertex() Vertex3d::z(int)3 Vertex3d::Vertex3d(int) PVertex::PVertex() call z function: PVertex::z(int):0 ~PVertex::PVertex() ~Vertex3d::Vertex3d() ~Vertex::Vertex() ~Point3d::Point3d() ~Point::Point()
此时PVertex并不调用V::z(float),PVertex::z(int)覆盖了函数Vertex::z(float),覆盖解决方法还是在PVertex中加入声明: using Vertex3d::z。
相关文章推荐
- 论Acmer的自我修养 (算法学习目标和推荐题目)
- HDU 1260 Tickets (很简单的基础DP题,找到状态转移方程就直接AC了)
- HDU 1176 免费馅饼 (类似于数塔DP的题目,注意边界条件,细节处理)
- HDU 1114 Piggy-Bank (完全背包水题,但注意一下时间输出)
- 学习C++中的多态
- 为什么模板类与模板成员函数不能分文件写(.h与.cpp)
- HDU 1087 Super Jumping!Jumping!Jumping求连续上升子序列的最大和值 (解析)
- HDU 1069 Monkey and Banana 对比优先权的设置和排序问题(解析)
- HDU 1029 Ignatius and the Princess IV(动规水题,有个很精妙的快解法)
- 数据类型总结(C++,C#)
- c++强制转换之dynamic_cast
- 在visual studio环境下简单在.cpp中调用python matplotlib
- IOS开发之Bug--关于C语言数组的容量参数
- C++中class的类型转换重载
- [C/C++]C++11中变长参数模板与初始化列表
- 有关C++类中的重载,覆盖与隐藏
- C++强制转换之static_cast
- C++学习笔记58——模板实参推断
- C++ 中Traits技术 (5) —— 关于STL中对迭代器封装的类型介绍
- c++ 遍历文件夹及其子文件夹