news 2026/8/8 23:22:45

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/7/26 2:22:13

收藏级!大模型底层原理详解(从极简到初级,小白程序员必看)

很多小白程序员和刚接触AI的朋友&#xff0c;每天用着DeepSeek、ChatGPT等大模型&#xff0c;却始终搞不懂它“开口即懂”的底层逻辑——其实大模型没有那么神秘&#xff0c;核心就是“算概率、选最优”。今天这篇文章&#xff0c;就从3个层级由浅入深拆解大模型底层原理&#…

作者头像 李华
网站建设 2026/8/5 7:24:53

事件意义与菩提心:两种普世路径的深层辨析

事件意义与菩提心&#xff1a;两种普世路径的深层辨析一、问题的核心&#xff1a;两种普世性的本质差异当我们说“每个事件都有意义”时&#xff0c;是在陈述一种本体论事实——意义作为存在的基本属性&#xff0c;如引力般普遍存在。当我们说“菩提心”时&#xff0c;是在倡导…

作者头像 李华
网站建设 2026/7/28 10:05:42

Yolov7模型训练指南:从环境搭建到最终应用

1. 环境搭建1.1 【 设备与系统配置 】我使用的设备配置为V100显卡双卡&#xff0c;总显存64GB&#xff0c;操作系统为Ubuntu 18.04&#xff0c;Python版本为3.7.10。在这样的环境下&#xff0c;我可以顺利地进行yolov7模型的训练。1.2 【 代码获取与准备 】在搭建好环境后&…

作者头像 李华
网站建设 2026/7/28 2:00:15

告别低效繁琐!千笔·专业降AI率智能体 VS 文途AI,研究生专属降AI率工具

在AI技术迅速渗透学术写作领域的当下&#xff0c;越来越多的研究生开始借助AI工具提升论文撰写效率。然而&#xff0c;随着各大查重系统对AI生成内容的识别能力不断升级&#xff0c;如何有效降低AI率、避免重复率超标&#xff0c;已成为众多学生面临的核心难题。面对市场上五花…

作者头像 李华
网站建设 2026/8/5 6:59:34

Golang构建AI智能体社交网络:MoltBook分布式架构实战

引言 2026年初,全球首个专为AI智能体设计的社交网络平台MoltBook在科技圈引发轰动。在短短48小时内,超过15万个AI智能体涌入平台,自发形成了上万个主题社区(Submolts),甚至诞生了名为"龙虾教"(Crustafarianism)的虚拟宗教。这一现象级实验不仅展示了AI群体自…

作者头像 李华