本文所述内容如有差错,欢迎评论区指出。
我们都知道子类继承父类,然后父类指针指向子类对象,则父类指针调用的虚函数其实是调用的子类的虚函数。如下所示,这里假设test()函数前面加了virtual,变为了虚函数:
- Derive d;
- Base* b = &d;
- Derive* p = &d;
- b->test();
- p->test();
这时候就会有个困惑,如果没有加virtual,是否还能实现这样的效果。在java语言中,是可以实现的,只要重写了父类函数。如下所示:
- public class Main {
- public static class Base
- {
- public void test() {
- System.out.println("test base");
- }
- }
- public static class Derive extends Base{
- public void test() {
- System.out.println("test Derive");
- }
- }
- public static void main(String[] args) {
- Derive d = new Derive();
- Base b = d;
- d.test();
- b.test();//和C++效果一样
- }
- }
运行结果如下:

在C++中,父类函数前面不加virtual,则无法实现多态特性,直接上代码进行对比。
- #include
- using namespace std;
- class Base
- {
- public:
- void test()
- {
- cout<<"test base"<
- }
- virtual void testV()
- {
- cout<<"test base V"<
- }
- };
-
- class Derive:public Base
- {
- public:
- void test()
- {
- cout<<"test Derive"<
- }
- virtual void testV()
- {
- cout<<"test Derive V"<
- }
- };
-
- int main()
- {
- Derive d;
- Base* b = &d;
- Derive* p = &d;
- b->test();
- p->test();
- b->testV();
- p->testV();
- }
运行结果如下:

如上图所示,有无virtual对于多态特性的实现是非常重要的,test()没有添加virtual关键字,则编译器直接按照类型来调用对应的函数,不会考虑多态特性。testV()由于添加了virtual关键字,则编译器会考虑多态特性,在运行时调用子类的testV()函数。也就是说C++没有什么隐藏规则,有些书中会提到隐藏规则,大家注意辨别。
-
相关阅读:
flask 框架web开发视频笔记
请求的接口响应状态为已取消的原因
mysql innodb 事务隔离性实现原理
element+vue table上移+下移 拖拽
图扑数字孪生洗煤厂,低代码构建云端工厂
【微信小程序】缓存数据库操作类——prototype和ES6方法
SpringBoot与ES7实现多条件搜索
spark性能调优 | 默认并行度
2024信息系统、信号处理与通信技术国际会议(ICISPCT2024)
如何把利用paddlepaddle导出的json文件转化为yolo或者voc文件
-
原文地址:https://blog.csdn.net/qq_23418043/article/details/126316239
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU