位置: IT常识 - 正文
推荐整理分享深入理解 virtual 关键字(深入理解linux内核),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:深入理解中国式现代化心得体会,深入理解中国式现代化论文,深入理解计算机系统,深入理解中国式现代化,深入理解计算机系统 第三版 pdf,深入理解java虚拟机,深入理解计算机系统,深入理解计算机系统 第三版 pdf,内容如对您有帮助,希望把文章链接给更多的朋友!
为什么会写这篇文章?主要是因为项目中的代码大量使用了带virtual关键字的类,想通过本文浅谈一下。virtual并没有什么超能力可以化腐朽为神奇,它有其存在的理由,但滥用它是一种非常不可取的错误行为。本文将带你一步一步了解virtual机制,为你揭开virtual的神秘面纱。
为什么需要virtual假设我们正在进行一个公共图形化库的设计实现,其中涉及2d和3d坐标点的打印,设计出Point2d和Point3d的实现如下:
#include <stdio.h>class Point2d {public: Point2d(int x = 0, int y = 0): _x(x), _y(y) {} void print() const { printf("Point2d(%d, %d)\n", _x, _y); }protected: int _x; int _y;};class Point3d : public Point2d {public: Point3d(int x = 0, int y = 0, int z = 0):Point2d(x, y), _z(z) {} void print() const { printf("Point3d(%d, %d, %d)\n", _x, _y, _z); }protected: int _z;};int main() { Point2d point2d; Point3d point3d; point2d.print(); //outputs: Point2d(0, 0) point3d.print(); //outputs: Point3d(0, 0, 0) return 0;}完美,一切都符合预期。既然如此,我们为什么需要virtual?让我们提个新需求:封装一个坐标点打印接口,输入是坐标点实例,输出是坐标点的值。很快,我们实现了代码:
void print(const Point2d &point) { point.print();}int main() { Point2d point2d; Point3d point3d; print(point2d); //outputs: Point2d(0, 0) print(point3d); //outputs: Point2d(0, 0) return 0;}问题来了,当我们传入3d坐标点实例时,我们的期望是打印3d坐标点的值,而实际只能打印2d坐标点的值。现在的程序分不清坐标点是2d还是3d,为了让程序变得更聪明,需要对症下药,而virtual正是该症的药方。只需要更新Point2d接口print的
下一篇:python能读取tsv吗(python读取text)
友情链接: 武汉网站建设