C++构造函数与虚表覆盖
2024-08-28 12:00:17
在涉及到虚函数的情况下,C++构造函数的构造顺序为:先调用构造函数,虚表指针初始化,用户代码;如涉及到多重继承情况,初始化顺序为基类、子类(从左至右),假设一个类的继承情况如下图,其初始化顺序为:Point,Point3d,Vertex,Vertex3d,PVertex,而这样的调用顺序说明在构造函数中调用虚函数是安全的,即时在初始化列表中基类构造函数在用户函数后面,g++编译器亦会自动调整。
我们假设上述类的虚函数中设计到虚函数(析构函数未计算)如上图所示,虚函数中出现了重载,子类中选择性重载虚函数,虚函数与重载就会出现:重载优先级高于虚函数的情况。PVertex类中只实现z(int)函数的情况下:
PVertex vertex();
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。
最新文章
- BUTTONS V. 2.0.0——CSS按钮库
- Prim算法(三)之 Java详解
- NOIP2010提高组乌龟棋 -SilverN
- cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused
- 关于JS及应用程序开发的一些体会
- 命令cd
- Qualcomm Web Site For Android Development
- Dedecms调用文章发布时间的方法
- char、varchar、varchar(2)的区别
- php获取当前月与上个月月初及月末时间戳的方法
- mysql的执行过程
- js实现原生选项卡
- linux下pppoe连接管理
- Android多线程编程<;二>;Handler异步消息处理机制之Message
- 第 15 章 位操作(fields)
- [PHP-DI] 理解依赖注入
- [转]Linux内核源码详解--iostat
- python mysql 封装
- Android-Java-了解编译
- nio入门教程