千家信息网

实现C++虚函数时的注意事宜有哪些

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,实现C++虚函数时的注意事宜有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++中的C++虚函数的作用主要是实现了多态的机制,
千家信息网最后更新 2026年11月03日实现C++虚函数时的注意事宜有哪些

实现C++虚函数时的注意事宜有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

C++中的C++虚函数的作用主要是实现了多态的机制,虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的,简称为V-Table,供大家学习参考!

如果一个类不包含虚函数,这经常预示不打算将它作为基类使用。当一个类不打算作为基类时,将析构函数声明为虚拟通常是个坏主意。考虑一个表现二维空间中的点的类:

class Point { // a 2D point   public:  Point(int xCoord, int yCoord);  ~Point();   private:  int x, y;  };

如果一个 int 占 32 位,一个 Point 对象正好适用于 64 位的寄存器。而且,这样一个 Point 对象可以被作为一个 64 位的量传递给其它语言写的函数,比如 C 或者 FORTRAN。如果 Point 的析构函数是虚拟的,情况就完全不一样了。

C++虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。

vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含C++虚函数的类都关联到 vtbl。当一个对象调用了虚函数,实际的被调用函数通过下面的步骤确定:找到对象的 vptr 指向的 vtbl,然后在 vtbl 中寻找合适的函数指针。

虚函数如何被实现的细节是不重要的。重要的是如果 Point 类包含一个虚函数,这个类型的对象的大小就会增加。在一个 32 位架构中,它们将从 64 位(相当于两个 int)长到 96 位(两个 int 加上 vptr);

在一个 64 位架构中,他们可能从 64 位长到 128 位,因为在这样的架构中指针的大小是 64 位的。为 Point 加上 vptr 将会使它的大小增长 50-100%!Point 对象不再适合 64 位寄存器。而且,Point 对象在 C++ 和其他语言(比如 C)中。

看起来不再具有相同的结构,因为其它语言缺乏 vptr 的对应物。结果,Points 不再可能传入其它语言写成的函数或从其中传出,除非你为 vptr 做出明确的对应,而这是它自己的实现细节并因此失去可移植性。

这里的基准就是不加选择地将所有析构函数声明为虚拟,和从不把它们声明为虚拟一样是错误的。实际上,很多人总结过这条规则:当且仅当类中至少包含一个虚拟函数时,则声明一个虚析构函数。

但是,当完全没有C++虚函数时,就可能和非虚析构函数问题发生撕咬。例如,标准 string 类型不包含C++虚函数,但是被误导的程序员有时将它当作基类使用:

SpecialString *pss = new SpecialString("Impending Doom");   std::string *ps;  ...  ps = pss; // SpecialString* => std::string*  ...  delete ps; // undefined! In practice,  // *ps's SpecialString resources  // will be leaked, because the  // SpecialString destructor won't  // be called.

一眼看上去,这可能无伤大雅,但是,如果在程序的某个地方因为某种原因,你将一个指向 SpecialString 的指针转型为一个指向 string 的指针,然后你将 delete 施加于这个 string 指针,你就立刻被送入未定义行为的领地。

关于实现C++虚函数时的注意事宜有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

函数 C++ 对象 指针 指向 语言 问题 信息 大小 架构 事宜 重要 两个 实际 寄存器 情况 更多 程序 类型 细节 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 河南云网互联网络科技有限公司 互联网科技资迅 互联网中国科技 互联网科技的 互联网未来科技 亿人帮互联网科技 互联网前沿科技 互联网科技大会案例 盛创互联网科技有限公司 团飞科技与伯堂互联网服务平台 特约风豹互联网科技为什么扣费 互联网数据科技专业 梅州GM互联网络科技有限公司 云南省自由互联网科技有限公司 互联网营销推广黑科技 普陀区互联网教育科技管理办法 广西科技产业互联网是什么 互联网科技大会大佬 华人运通互联网科技公司 河南云网互联网络科技有限公司 金融科技创新监管互联网金融 科技互联网公司logo 互联网科技咨询 重庆威客帮互联网科技 想开互联网科技公司怎么样 济南有互联网科技公司吗 上海钢联属于互联网科技股吗 北京军民互联网科技公司 互联网 科技节活动 微视频大赛
0