news 2026/4/23 10:11:17

C++之多态及虚函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++之多态及虚函数

文章目录

  • 多态
  • 虚函数

多态

  • 多态性是面向对象程序设计语言的又一重要特征,多态(polymorphism)通俗地讲,就是用一个相同的名字定义许多不同的函数,这些函数可以针对不同数据类型实现相同或相似的功能,即所谓的“一个接口,多种实现”
#include<iostream>usingnamespacestd;classShape{public:virtualvoiddraw(void){cout<<"draw shape"<<endl;}};classRect:publicShape{public:voiddraw(void){cout<<"draw Rect"<<endl;}};classCircle:publicShape{public:voiddraw(void){cout<<"draw Circle"<<endl;}};classEllipse:publicShape{public:voiddraw(void){cout<<"draw Ellipse"<<endl;}};intmain(void){/* Ellipse e; e.draw(); e.Shape::draw(); */Shape*buf[128]={0};buf[0]=newRect;buf[1]=newCircle;buf[2]=newEllipse;for(inti=0;buf[i]!=NULL;i++){buf[i]->draw();}return0;}

虚函数

  • 被virtual关键字修饰的成员函数称为虚函数
  • 如果将基类中的某个成员函数声明为虚函数,那么子类中与该函数具有相同原型的成员函数就也是虚函数,并且对基类中版本形成覆盖,即函数重写
  • 如果子类提供了对基类虚函数有效的覆盖,那么通过指向子类对象的基类指针,或者通过引用子类对象基类引用,调用该虚函数,实际被执行将是子类中的覆盖版本,而不再是基类中原始版本,这种语法现象被称为多态
  • 多态的意义在于,一般情况下,调用哪个类的成员函数由调用者指针或者引用本身类型决定的, 而有了多态,调用哪个类的成员函数由调用者指针或者引用实际目标对象的类型决定
  • 这样一来,源自同一种类型的同一种激励,竟然可以产生多种不同的响应,也就是对于同一个函数调用,能够表达出不同的形态,即为多态
  • 虚函数覆盖的条件:
    • 只有类中的成员函数才能声明为虚函数,而全局函数、静态成员函数、构造函数都不能被声明为虚函数
    • 只有在基类中以virtual关键字声明的虚函数,才能作为虚函数被子类覆盖,而与子类中的virtual关键字无关
    • 虚函数在子类中的版本和基类中版本要具有相同的函数签名,即函数名、参数表、常属性一致
    • 如果基类虚函数返回基本类型的数据,那么子类中的版本必须返回相同类型的数据;如果基类虚函数返回类类型指针(A)或引用(A&),那么允许子类中的版本返回其子类类型指针(B)或引用(B&)
#include<iostream>usingnamespacestd;classA{};classB:publicA{};classBase{public:virtualvoidfunc(void){cout<<"Base func"<<endl;}virtualA*foo(void){cout<<"Base foo"<<endl;}};classDerived:publicBase{voidfunc(void){cout<<"Derived func"<<endl;}B*foo(void){cout<<"Derived foo"<<endl;}};intmain(void){Derived d1;Base*pd1=&d1;pd1->func();Base&pd2=d1;pd2.foo();return0;}
  • 产生多态的条件:
    • 除了要满足函数重写的语法要求,还必须是通过指针或引用调用虚函数,才能表现出来
#include<iostream>usingnamespacestd;classA{};classB:publicA{};classBase{public:virtualvoidfunc(void){cout<<"Base func"<<endl;}virtualA*foo(void){cout<<"Base foo"<<endl;}};classDerived:publicBase{voidfunc(void){cout<<"Derived func"<<endl;}B*foo(void){cout<<"Derived foo"<<endl;}};intmain(void){Derived d1;Base b=d1;b.func();//实际上调用 base中的funcreturn0;}
  • 调用虚函数的指针也可以是this指针,当使用子类对象调用基类中的成员函数时,该函数里面this指针将是一个指向子类对象的基类指针,再通过this去调用满足重写要求的虚函数同样可以表现多态的语法特性
#include<iostream>usingnamespacestd;classA{};classB:publicA{};classBase{public:virtualvoidfunc(void){cout<<"Base func"<<endl;}A*foo(void){//this->func();func();}};classDerived:publicBase{voidfunc(void){cout<<"Derived func"<<endl;}};intmain(void){Derived d1;d1.foo();return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:57:59

收藏!新人转行大模型赛道全攻略|小白/程序员必看,少走1年弯路

作为深耕大模型领域多年的从业者&#xff0c;今天结合自身实战经验&#xff0c;专门给想转行大模型赛道的小伙伴&#xff0c;掰开揉碎讲清楚核心问题——新人到底该怎么顺利切入大模型赛道&#xff1f; 不管你是刚接触AI的小白、想跨界的程序员&#xff0c;还是校招/社招打算转…

作者头像 李华
网站建设 2026/4/22 16:24:34

揭秘CANN算子仓库:从基础算子到AIGC性能突破的实战之路

CANN组织链接&#xff1a;https://atomgit.com/cann ops-nn仓库链接&#xff1a;https://atomgit.com/cann/ops-nn 在人工智能技术日新月异的今天&#xff0c;AIGC&#xff08;生成式AI&#xff09; 已成为推动产业变革的核心引擎。从图像生成到自然语言处理&#xff0c;再到科…

作者头像 李华
网站建设 2026/4/23 1:37:29

装机小白必备!这个3D可视化工具让DIY组装电脑变得超简单

文章目录 📖 介绍 📖 🏡 演示环境 🏡 📒 在线3D装机工具体验 📒 🎯 工具简介 📝 使用提示 🌐 界面语言 💰 价格说明 ⚠️ 其他注意事项 ⚓️ 相关链接 ⚓️ 📖 介绍 📖 想组装一台电脑却不知道从哪里开始?面对琳琅满目的硬件型号,担心兼容性问题,又…

作者头像 李华
网站建设 2026/4/23 2:25:49

基于Vue+springboot充电桩共享服务管理系统的设计与实现

目录系统概述技术架构核心功能创新点应用价值开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 该系统基于Vue.js前端框架与Spring Boot后端框架&#xff0c;设计并实现了一个充电桩共享服务管理平台。系统采用前…

作者头像 李华
网站建设 2026/4/23 11:31:28

2025【网络安全含金量 TOP4 证书】:NISP、CISP、CISP-PTE、CISSP(必考)|零基础入门到精通,看完这一篇就够了

网络安全证书合集&#xff0c;看这一篇就够了&#xff01; 随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;网络安全行业也因此备受瞩目。在这一领域中&#xff0c;持有权威证书的专业人才备受欢迎。本文将为您介绍网络安全行业的热门证书&#xff0c;帮…

作者头像 李华
网站建设 2026/4/23 11:32:18

网站出现访问卡顿或频繁崩溃,高防 CDN 如何解决?

高防 CDN 的解决方案 高防 CDN&#xff08;内容分发网络&#xff09;通过分布式节点和防护机制缓解网站卡顿或崩溃问题。以下是具体解决方式&#xff1a; 分布式节点负载均衡 高防 CDN 在全球部署多个边缘节点&#xff0c;将用户请求自动分配到最近的服务器&#xff0c;减少延…

作者头像 李华