码迷,mamicode.com
首页 > 编程语言 > 详细

C++面试题(4-6)

时间:2015-04-08 23:30:41      阅读:378      评论:0      收藏:0      [点我收藏+]

标签:

题:(4)

类成员函数的重载、覆盖和隐藏区别?

答案:

a.成员函数被重载的特征:

  • 相同的范围(在同一个类中);
  • 函数名字相同;
  • 参数不同;
  • virtual 关键字可有可无。

b.覆盖是指派生类函数覆盖基类函数,特征是:

  • 不同的范围(分别位于派生类与基类);
  • 函数名字相同;
  • 参数相同;
  • 基类函数必须有virtual 关键字。

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

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

题(5)

请说明C++中的多态性,并详解虚函数机制

答案:

多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。
C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数。
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
多态的作用是为了接口重用。

虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。
虚函数表实际上是一个函数指针的数组,每个虚函数占用这个数组的一个位置。一个类只有一个虚函数表,不管它有多少个实例。
派生类有自己的虚函数表,派生类的虚函数表与基类的虚函数表有相同的函数排列顺序(即包含基类虚函数表),同名的虚函数被放在两个数组的相同位置上(即派生类的虚函数覆盖掉基类的虚函数)。
在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的虚函数表,存在于对象实例中最前面的位置。通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写!
更详细的解析

题(6)

请说明将“引用”作为函数返回值类型的格式、好处和需要遵守的规则

答案:

格式:

<!-- lang: cpp -->
类型标识符 &函数名(形参列表及类型说明){   //函数体   }

好处:在内存中不产生被返回值的副本。

规则:

  • 不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
  • 不能返回函数内部new分配的内存的引用。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成内存泄露。
  • 可以返回类成员的引用,但最好是const。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性(即破坏封装)。
  • 流操作符和赋值操作符重载必须返回引用。为了支持连续使用,因此返回值应该是一个仍然支持这两个操作符的引用。
  • +-*/ 四则运算符重载不能返回引用。

C++面试题(4-6)

标签:

原文地址:http://my.oschina.net/hoolev/blog/397604

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!