首页 > 试题广场 >

下面有关继承、多态、组合的描述,说法错误的是?

[单选题]
下面有关继承、多态、组合的描述,说法错误的是?
  • 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
  • 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
  • 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了
  • 覆盖是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同
重载:
    只有在 同一类定义中的同名成员函数才存在重载关系 ,主要特点是 函数的参数类型和数目有所不同 ,但 不能出现函数参数的个数和类型均相同 ,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致的。另外,重载和成员函数是否是虚函数无关

覆盖:
    派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数。

隐藏:
  
派生类中的函数屏蔽了基类中的同名函数,
2个函数参数相同,但基类函数不是虚函数(和覆盖的区别在于基类函数是否是虚函数)。2个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽(和重载的区别在于两个函数不在同一类中)。

发表于 2015-05-08 10:10:58 回复(11)
重载、覆盖隐藏 的详细释义自行Google;
(下述<函数参数相同>是指 参数个数 、 参数类型 返回类型 均相同)
一、重载(overload):
       特征: 函数名相同 、函数参数不同、 必须位于同一个域(类)中;
二、覆盖(override):
       特征: 函数名相同 、函数参数相同、 分别位于派生类和基类中、virtual(虚函数);
三、隐藏(hide):
       即:派生类中函数隐藏(屏蔽)了基类中的同名函数。
       情形1: 函数名相同、 函数参数相同、 分别位于派生类和基类中、virtual -- 覆盖;
       情形2: 函数名相同、 函数参数相同、 分别位于派生类和基类中   -- 隐藏;(即跟覆盖的区别是基类中函数是否为虚函数
       情形3 函数名相同、 函数参数不同、 分别位于派生类和基类中   -- 隐藏;(即与重载的区别是两个函数是否在同一个域(类)中)
       关于隐藏的理解,在调用一个类的成员函数时,编译器会沿着类的继承链逐级向上查找函数的定义,如果找到了则停止查找;所以如果一个派生类和一个基类都有一个同名函数(不论函数参数是否相同),而编译器最终选择了在派生类中的函数,那么就说这个派生类的成员函数“隐藏”了基类的同名函数,即它阻止了编译器继续向上查找函数的定义。(所以对于上述的情形3,同名函数,虽函数参数不同,但位于派生类和基类中时,基类函数会审美观点屏蔽。) 参考链接:http://www.cppblog.com/lingyun1120/archive/2011/04/27/145135.html
       补充一点:关于隐藏的情形2,相当于是重新定义了基类中non-virtual函数,这样其实并不好,详情可参考 《Effective C++》中条款36:绝不重新定义继承而来的non-virtual函数
编辑于 2016-08-26 11:01:08 回复(1)
Java中没有隐藏一说 出题者为何能混合Java与C++呢?
发表于 2016-01-14 13:31:09 回复(3)
选D,使用相同函数名但参数个数不同或参数类型不同应该是函数重载,函数覆盖发生在父类与子类之间,其函数名、参数类型、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做函数覆盖。
编辑于 2015-11-12 19:48:36 回复(8)
我看都没有解释A的, A选项,首先封装的目的是将类的设计和实现分离,利于后期维护修改类,也相对减少代码的改动量。 不是说封装之后就是个抽象类,抽象类是因为有纯虚函数的声明。带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构,因此,我觉得A也说的不严格正确。
发表于 2016-12-04 00:34:40 回复(3)
B 派生类无法使用基类的私有成员.
D 覆写至少基类的函数是虚函数, 并且 子类函数和父类函数名,形参 返回值  一模一样 函数代码体可自己实现

发表于 2016-08-01 09:35:50 回复(0)
D是重载
发表于 2015-04-21 16:37:03 回复(0)
来自@ 与我同行
B选项:基类中的私有成员,派生类是不能能够继承的。
重载:
只有在 同一类定义中的同名成员函数才存在重载关系 ,主要特点是 函数的参数类型和数目有所不同 ,但 不能出现函数参数的个数和类型均相同 ,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致的。另外,重载和成员函数是否是虚函数无关
覆盖:
派生类中覆盖基类中的同名函数,要求两个函数的参数个数、参数类型、返回类型都相同,且基类函数必须是虚函数。
隐藏:
派生类中的函数屏蔽了基类中的同名函数,
2个函数参数相同,但基类函数不是虚函数(和覆盖的区别在于基类函数是否是虚函数)。2个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽(和重载的区别在于两个函数不在同一类中)。

编辑于 2017-05-05 21:40:19 回复(0)
发表于 2021-09-27 18:32:33 回复(0)

题目出的有问题,意思没描述清楚。

B选项:说法错误。继承无法使用现有类中的所有功能,比如被private修饰的函数。

这种题目好扯淡,表意不清,强揪概念。

发表于 2019-11-17 17:20:48 回复(0)
重载 重写等于覆盖 隐藏
发表于 2019-05-20 09:47:39 回复(0)
若要覆盖基类中的同名函数,则两个函数的参数个数、参数类型和返回类型都必须相同,且基类必须为虚函数,故选D。
编辑于 2018-12-02 17:01:22 回复(0)
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

发表于 2017-12-19 10:05:51 回复(0)
重载、覆盖 与 隐藏 的详细释义自行Google;
(下述<函数参数相同>是指 参数个数 、 参数类型  返回类型 均相同)
一、重载(overload):
       特征: 函数名相同 、函数参数不同、 必须位于同一个域(类)中;
二、覆盖(override):
       特征: 函数名相同 、函数参数相同、 分别位于派生类和基类中、virtual(虚函数);
三、隐藏(hide):
       即:派生类中函数隐藏(屏蔽)了基类中的同名函数。
       情形1: 函数名相同、 函数参数相同、 分别位于派生类和基类中、virtual --  覆盖;
       情形2: 函数名相同、 函数参数相同、 分别位于派生类和基类中   -- 为 隐藏;(即跟覆盖的区别是基类中函数是否为虚函数
       情形3  函数名相同、 函数参数不同、 分别位于派生类和基类中   -- 为 隐藏;(即与重载的区别是两个函数是否在同一个域(类)中)
       关于隐藏的理解,在调用一个类的成员函数时,编译器会沿着类的继承链逐级向上查找函数的定义,如果找到了则停止查找;所以如果一个派生类和一个基类都有一个同名函数(不论函数参数是否相同),而编译器最终选择了在派生类中的函数,那么就说这个派生类的成员函数“隐藏”了基类的同名函数,即它阻止了编译器继续向上查找函数的定义。(所以对于上述的情形3,同名函数,虽函数参数不同,但位于派生类和基类中时,基类函数会审美观点屏蔽。) 参考链接:http://www.cppblog.com/lingyun1120/archive/2011/04/27/145135.html
       补充一点:关于隐藏的情形2,相当于是重新定义了基类中non-virtual函数,这样其实并不好,详情可参考 《Effective C++》中条款36:绝不重新定义继承而来的non-virtual函数
发表于 2017-09-11 17:05:52 回复(0)
C++隐藏不是private变量类外不可见吗?????
发表于 2016-06-12 11:23:53 回复(0)
B的话,如果函数私有就不行了
C:个人觉得应该加些限制条件,将隐藏和覆盖区分一下
发表于 2016-01-10 12:33:51 回复(1)
继承不能使用现有类中的用private关键字声明的变量和方法
发表于 2016-01-03 20:28:41 回复(0)
还是把这题删了吧。。。
发表于 2015-11-20 17:27:18 回复(1)
没有仔细看d选项我就直接选c了
d说的应该是重载。
但是我个人理解的隐藏是,类中的某些信息对外不可见,例如private那种。
发表于 2015-09-09 18:12:53 回复(0)
D.
覆盖也叫重写,是子类重写了父类的方法,方法名,参数列表,返回值都完全相同,在同一个类中方法的重载才是参数列表不同。
发表于 2015-08-28 11:57:22 回复(0)