首页

文章

在C++中用虚函数的作用是什么?为什么要用到虚函数

发布网友 发布时间:2022-03-18 00:38

我来回答

2个回答

热心网友 时间:2022-03-18 02:07

虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

众所周知,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例12.1(具体代码请查看:C++多态性的一个典型例子)
程序中,在Circle类中定义了
area函数,在Circle类的派生类Cylinder中也定义了一个area函数。这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不
同,函数体是不同的。前者的作用是求圆面积,后者的作用是求圆柱体的表面积。这是合法的,因为它们不在同一个类中。
编译系统按照同名覆盖的原则决定调用的对象。在例12.1程序中用cy1.area( )
调用的是派生类Cylinder中的成员函数area。如果想调用cy1 中的直接基类Circle的area函数,应当表示为
cy1.Circle::area()。用这种方法来区分两个同名的函数。但是这样做 很不方便。

人们提出这样的设想,能否用同一个调用形式,既能调用派生类又能调用基类的同名函数。在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。例如,用同一个语句“pt->display( );”可以调用不同派生层次中的display函数,只需在调用前给指针变量 pt 赋以不同的值(使之指向不同的类对象)即可。

打个比方,你要去某一地方办事,如果乘坐公交车,必须事先确定目的地,然后乘坐能够到达目的地的公交车线路。如果改为乘出租车,就简单多了,不必查行车路
线,因为出租车什么地方都能去,只要在上车后临时告诉司机要到哪里即可。如果想访问多个目的地,只要在到达一个目的地后再告诉司机下一个目的地即可,显
然,“打的”要比乘公交车 方便。无论到什么地方去都可以乘同—辆出租车。这就是通过同一种形式能达到不同目的的例子。

C++中的虚函数就是用来解决这个问题的。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

热心网友 时间:2022-03-18 03:25

简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码

#include<iostream>
usingnamespacestd;
classA
{
public:
voidprint()
{
cout<<"ThisisA"<<endl;
}
};

classB:publicA
{
public:
voidprint()
{
cout<<"ThisisB"<<endl;
}
};

intmain()
{
//为了在以后便于区分,我这段main()代码叫做main1
Aa;
Bb;
a.print();
b.print();
return0;
}

输出结果分别是“ThisisA”、“ThisisB”。通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,但这是否真正做到了多态性呢?No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。那现在就把main()处的代码改一改。

intmain()
{
//main2
Aa;
Bb;
A*p1=&a;
A*p2=&b;
p1->print();
p2->print();
return0;
}

运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A。问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数

classA
{
public:
virtualvoidprint(){cout<<"ThisisA"<<endl;}
};

classB:publicA
{
public:
voidprint(){cout<<"ThisisB"<<endl;}
};

毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数。所以,class B的print()也成了虚函数。那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了。

现在重新运行main2的代码,这样输出的结果就是This is A和This is B了。

现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。
历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... c++虚函数是干什么的?我没看懂,谁能给我讲一下 C++中虚函数的作用是什么?定义是什么?简要说明下,并举一个简单的例子? C++虚函数问题,续函数如何运行的机制 Objective-C有虚函数的概念吗? c++中什么是实函数 什么是虚函数 c++虚函数的说明 面向对象多态机制中,多个子类以不同的方式实现了父类里的虚函数,子类对象要调用父类中的虚函数时,父类 c/c++高手帮忙!!!c++中的virtual函数究竟是怎么实现的,用 C 语言表达出来,代码请加注释。 c加加多态的种类,各自实现的机制 虚函数的实现方式和C语言中的哪个数据类型相似 C语言问题虚函数的问题 C++中虚函数的作用是什么?它应该怎么用呢? c++中,虚函数的运行机制是什么 谁知道 C++ 中 虚函数的工作机制???? 求问,C++中纯虚函数的实现原理是什么,即C++通过什么样的机制来实现这个功能的?不是问它的作用是什么。 手机突然从4G变成E是什么意思? 4G网上的好好的,突然变成“E”是啥意思 Viⅴo27移动4g变成e怎么解决? 苹果4G变E了怎么切换回来? 为什么手机网络突然从4G变成一个E了 c 虚函数的作用举例? 苹果7查询序列号出现无法验证产品购买日期是怎么回事啊 苹果序列号无法验证购买日期怎么办? 买的apple airpodspro官网查询序列号之后显示购买日期未验证是什么意思? 苹果序列号无法验证购买日期怎么办 官网查询序列号,提示让我验证购买日期是什么鬼 苹果序列号验证提示我们无法验证您产品的购买日期。是什么意思,这机器是翻新机吗 苹果耳机序列号显示购买日期未验证 苹果12序列号查询显示购买日期未验证? 苹果耳机序列号显示无法验证购买日期 新买的苹果8P,用了一天,查序列号显示,我们无法验证您产品的购买日期 苹果手机查询序列号提示需要验证购买日期,这是怎么回事? 新macbook查序列号显示“购买日期未验证”有没有问题? 苹果官网序列号查询需要提供购买时间但是显示无法完成请求是什么意思 苹果耳机我们无法验证您产品的购买日期 刚买的iPhone11为什么官网查询显示购买日期未验证? iphone12序列号显示购买日期未验证 pencil查序列号显示购买日期未验证 windows10打开文件夹就卡死 电脑一打开文件夹就卡死
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com