|
|
|
|
移动端

1.16.3 继承(1)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍继承。

作者:猿媛之家来源:机械工业出版社|2017-12-06 18:44

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.16.3  继承(1)

【真题 258】下面程序的运行结果是( )。

  1. #include<iostream> 
  2. using namespace std;  
  3. class Base  
  4. {  
  5. int x;  
  6. public:  
  7. Base(int b) :x(b) {}  
  8. virtual void display()  
  9. {  
  10. cout << x << endl;  
  11. }  
  12. };  
  13. class Derived :public Base  
  14. {  
  15. int y;  
  16. public:  
  17. Derived(int d) :Base(d + 2), y(d) {}  
  18. void display()  
  19. {  
  20. cout << y << endl;  
  21. }  
  22. };  
  23. int main()  
  24. {  
  25. Base b(2);  
  26. Derived d(3);  
  27. b.display();  
  28. d.display();  
  29. Base *p = &d;  
  30. p->display();  
  31. return 0;  

A.2,2,3 B.3,2,2 C.2,3,3  D.2,3,2 答案:C。在面向对象中,多态指的是使用相同的函数名来访问函数不同的实现方法,即“一种接口,多种方

法”,用相同的形式访问一组通用的运算,每个运算可能对应的行为不同。 C++语言支持编译时多态和

运行时多态,其中,编译时多态指的是系统在编译时能确定调用哪个函数,它具有执行速度快的优点,

运算符重载和函数重载就是编译时多态。运行时多态指的是系统在运行时动态决定调用哪个函数,它为

系统提供了灵活和高度问题抽象的优点,通过继承和虚函数实现运行时多态。运行时多态的基础是基类

指针,基类指针可以指向任何派生类对象。

在基类中的某成员函数被声明为虚函数后,在之后的派生类中可以被重新定义。但在定义时,其函

数原型,包括返回类型、函数名、参数个数和参数类型的顺序,都必须与基类中的原型完全相同。只要

在基类中显式声明了虚函数,那么在之后的派生类中就不需要用关键字 virtual来显式声明了,可以略去,

因为系统会根据其是否和基类中虚函数原型完全相同来判断是不是虚函数。所以,派生类中的虚函数如

果不显式声明也还是虚函数。

对于虚函数,有几点内容需要引起读者注意:

1)因为虚函数使用的基础是赋值兼容(赋值兼容是指在需要用到基类对象的任何地方都可以用公有派生类的对象来代替),而赋值兼容成立的条件是派生类从基类 public继承而来。所以,当使用虚函数时,派生类必须是基类 public派生的。

2)定义虚函数时,不一定要在最高层的类中,而是看在需要动态多态性的几个层次中的最高层类中声明虚函数。

3)只有通过基类指针来访问虚函数才能实现运行时多态的特性。

4)一个虚函数无论被公有继承了多少次,它仍然是虚函数。

5)虚函数必须是所在类的成员函数,而不能是友元函数,也不能是静态成员函数。因为虚函数调用要靠特定的对象类决定该激活哪一个函数。

6)内联(

inline)函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的,即使虚函数在类内部定义,编译时将其看作非内联。

7)构造函数不能是虚函数,但析构函数可以是虚函数。

本题中,Base b(2)定义了一个父类的对象 b,语句 b.display()会调用 Base的 display方法输出 2。而 d的类型为 Derived,因此,语句 d.display()会调用 Derived的 display方法输出 3。虽然 p是指向 Derived类型的指针,但它实际上指向的是子类的对象,因此, p->display()函数调用的是派生类的 display()函数

(多态),输出为 3。所以,选项 C正确。

【真题 259】在 C++语言中,可以作为对象继承之间的转换的是()。

A.static_cast  B.dynamic_cast  C.const_static D.reinterpret_cast 答案:A、B。转换指的是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。 C++标准定义了四个

新的转换符: reinterpret_cast、static_cast、dynamic_cast和 const_cast,目的在于控制类( class)之间的类型转换。

对于选项 A,static_cast可以用于类层次结构中基类和子类之间指针或引用的转换。把子类的指针或引用转换成基类表示是安全的,但把基类指针或引用转换成子类指针或引用时,由于没有动态类型检查,所以,它是不安全的。基类和子类之间的动态类型转换一般建议使用 dynamic_cast。static_cast可以用作对象继承之间转换,只不过有安全隐患。因此,选项 A正确。

对于选项 B,dynamic_cast用于对象的指针和引用,当用于多态类型转换时,允许隐式转换及相反的转换操作,与 static_cast的不同之处在于,在相反的转换过程中, dynamic_cast会检测操作的有效性,如果返回的不是被请求的有效完整对象,则返回 null,反之返回这个有效的对象,如果是引用返回无效时,则会抛出 bad_cast异常。所以,选项 B正确。

对于选项 C,const_cast用来修改类型的 const或 volatile属性,具体而言, const_cast会操纵传递对象的 const属性,设置或者移除该属性。所以,选项 C错误。

对于选项 D,reinterpret_cast用来处理无关类型之间的转换,可以转换任意一个 32位整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,但不能将非 32位的实例转成指针。所以,选项 D错误。

所以,本题的答案为 A、B。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP网络编程从入门到精通

本书是为那些对Web开发感兴趣的读者而编写的。ASP(Active Server Pages)是微软公司在Web领域的又一次突破,它打破了以往只能由专业人员来...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊