c++中,直接用重写就是了,为什么有时候非要用重定义(覆盖)?不都是子类重新定义父类相同名称的函数吗?

如题所述

第1个回答  2012-06-18
首先要纠正下你的理解.

如果子类和父类2个函数签名相同,
1) 如果父类函数是virtual(虚函数), 那么子类函数是 "重写"
2) 如果父类函数不是virtual, 那么就是"重定义".

俩个函数关系是重写还是重定义, 要看父类函数是不是虚函数

也就是说:
1) 如果你需要动态绑定, 那么就把函数定义为virtual, 它的同名子类函数都是它的"重写"
2) 如果父类函数不是一个virtual函数, 但是你继承并且修改了这个函数, 你的行为就是重定义.

第2点比较少见, 通常不会去修改父类的非虚函数, 但是如果你只是想单纯的继承父类的代码, 而不期待动态绑定的话, 可以这么做, (例如继承标准库的std::vector, 如果你懒得写接口的话, 不过使用的话还是需要谨慎, 毕竟这些类型不是被设计为基类的)本回答被提问者采纳

C++ 覆盖与重写是不是一回事
override(重写)是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就...

在c++中子类中重写父类的函数为什么还能调用父类的函数?
1.语法就是如此,标委会规定能就说明有它的用处。2.如果派生类是想在基类该方法基础上加点什么语句比如加一句打印输出,重写的时候难道把父类的方法体全部拷贝一遍后加一句打印?这完全不符合代码可重用性的原则。

C++中子类的变量能不能覆盖父类的变量?
此时不会覆盖,但是会重写。即子类中访问成员变量时,访问的是子类的,父类的会被隐藏。但是通过父类名直接调用仍可以使用父类该变量。不属于覆盖,被称为重写。

C++编程中 子类(派生类)能不能重写父类(基类)的函数(方法),除了虚函数...
当然可以重写,函数名和参数保持一致就会重写;如果函数名一样,参数不一样则是隐藏;总之,非虚函数,只要子类定义了相同名称的,父类函数都不能直接访问。这样的问题,自己写个Test自然明了,印象也会更深刻。

C++:区别覆盖,重载与多态
满意回答中对于重载的解释明显有误,重载要求必须是在同一个类中,而不是在基类和派生类中,他的这种解释更确切的说应该是隐藏,而且覆盖的解释也有误,覆盖要求必须是virtual关键字声明的虚函数,而且在不同类,同名同参,如果为非虚函数,则为隐藏~~~...

C++:继承中的同名覆盖原则是什么意思?
当派生类与基类有相同成员时,例如:有一个基类Class A, A类里有个成员函数 int fun(),类B继承了类A,类B也有个成员函数,int fun(),在实现部分里,在调用下函数fun()下,由于基类和派生类的函数名一样,系统无法按原则(原则:先基类,然后对象,最后派生类)调用,就覆盖了。

c++隐藏与覆盖效果相同,只是用的地方不同是吧,子类会隐藏父类同名函数...
virtual必须参数完全一样

C++ 重写父类方法问题
用virutal修饰父类中要重写的函数即可,参考代码如下:

C++面试题汇总
重写\/覆盖: 不同名字空间---用于继承,子类重新定义父类中 函数名相同,参数列表也相同 虚函数 的方法 重定义\/隐藏:重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下: a 如果派生类的函数和基类的 函数同名,但是参数不同 ,此时,不管有无virtual,基类的函数被隐藏。 b 如果派生类的函数与基类 ...

c++的override关键字什么意思
覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,在继承中也可能会在子类覆盖父类中的方法。当将要定义一组函数,使执行一系列的操作,但是它们是应用在不同的参数类型上的。此时可以选择重载函数。例如: int z_x_...

相似回答