问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++ 覆盖与重写是不是一回事

发布网友 发布时间:2022-05-18 18:05

我来回答

5个回答

热心网友 时间:2023-10-22 09:09

覆盖与重写可以说是一样的,但与重载不同。
override(重写)是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就属于override。使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(也许是一系列函数,如果该函数在基类中有重载的话,呵呵)将被隐藏,可以通过域解析操作符来调用。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是override了。
overload(重载)则是指在相同作用域中,多个函数具有相同的名字,但参数的数目和类型各不相同(当然相同数目和类型,如果顺序不同也是可以的),因为函数重载的机制是在C++中函数的签名与其参数有关,而不像C中,只与函数名有关。总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同,呵呵。

函数的重载(overload)覆盖(override)隐藏
派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有VIRRUAL关键字.些时基类的函数将被隐藏,而不是覆盖.
派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有VIRRUAL关键字,基类的函数都将被隐藏.注意这种情况与重载的区别,重载发生在同一个类中。

热心网友 时间:2023-10-22 09:09

当然是不同的,
覆盖也就是隐藏,派生类和基类的函数名相同,并且要求基类函数不为虚函数;
否则就成了重写了

重写虚函数必须返回类型一致,名称一致,且参数一致;
不管重写或者是覆盖都是为了实现运行时的多态,亦决定了调用父类还是子类的函数。
覆盖既然隐藏了当然是各调各的了。

热心网友 时间:2023-10-22 09:09

楼主的理解是正确的。
frogoscar提供的信息相当全。简而言之就是,当子类中有跟基类相同定义的函数时,
△ 基类(含基类的基类)中该函数声明里如果都没有virtual的话,则是隐藏,生成的子类对象中调用的该函数是子类自己的成员函数而非继承来的基类的同名函数;
△如果基类该函数声明中有virtual,则为改写(override),实现多态:让基类指针p指向子类对象后,通过p调用该函数,其实是调用的子类的该成员函数。

热心网友 时间:2023-10-22 09:10

重载是相同函数名,但函数的参数不能完全相同。例如:
int f();
int f(int a);
这是重载。

重写是子类的函数实现覆盖了父类的函数实现,函数名和参数都要相同。例如:
class Base{
void f(){cout << "Base::f()" << endl;}

}
class Derive:public Base{
}
这种情况下通过子类对象调用f()函数就是使用的父类的函数
Derive d;
d.f();
会输出 Base::f()

class Base{
void f(){cout << "Base::f()" << endl;}

}
class Derive:public Base{
void f(){cout << "Deive::f()" << endl;}
}
这种情况下通过子类对象调用f()函数就是使用的自己的函数
Derive d;
d.f();
会输出 Derive::f()

热心网友 时间:2023-10-22 09:11

你这里说的覆盖与重写应该是一回事。
只不过在标准c++定义中不是这种叫法。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
赵玉平名家论坛 赵玉平人物经历 杭州市汽车西站 现在能提前几天售票啊? 请问杭州西站汽车票可以提前几天买? 杭州汽车西站在节假日的时候需要提前买票的吗 散步有助于减肥吗 魑瑟忝箜莫尘读什么 端午送什么 端午节家里要摆放什么东西 龙舟是如何制作的? C#重写和覆盖的区别 覆盖跟重写是不是一个意思啊? C#中重写和覆盖的区别 小米手机越做越垃圾,手机膜都不贴了 小米手机钢化膜起气泡怎么办 看到文中辛苦读书的高尔基,你想起哪些与之有关的成语或名言,试着写 筋疲力尽的相近成语 用两句话形容黄河鲤鱼的珍贵 金子旁一个青读什么 金字旁的青读什么 蜂蛹怎么煮汤 峰蛹煲鸡汤 oracle如何删除表属性 石材砖混凝土常用于哪些建筑 oracle如何最快的删除大数据量表中的多个字段 QE需要知道基础知识有哪些? 医院的侧血糖采血针会不会有问题? 关于HIV检测抽血 一个月前体检前有一个人被检查出来肺结核 派出所在农村采血,每户都要去一个人,是为了什么? C#中的重写和覆盖的区别 描述覆盖和重写的区别,以及它们各自的试用场合 雪花是哪个标志 C++覆盖与重写是不是一回事? 轿车雪花标志是什么 雨夹雪的符号是什么? 请问重载overload,覆盖override,重写overwrite,这三者之间有什么区别呢? 怎么才能让在别的手机上登录不用验证码 微信怎样可以不用短信验证就登录? 微信登陆手机号不用验证码可以吗? 网名会不会影响人的运势? 一个人的网名和笔名对人的运势有多少影响 财运的网名 昆明经过宜宾达州的火车时刻表 食粪的介绍 食粪症的简介 食粪症的介绍 食粪者有成就吗 艾尔登法环 食粪者套叫什么 我有食粪癖怎么治