您现在的位置是:首页 > 正文

关于《程序员面试宝典》中一道面试题的答案

2024-02-01 04:39:38阅读 3

说明:

本文是前段时间发表在CSDN上的文章。后来通读了《程序员面试宝典》,发现里面给出的错误答案很多,所以除非是你特别明确的问题,不要轻易相信其中的结论:)

 

今天一朋友拿着《程序员面试宝典》来和我商量一道题目,以前听说过这本书的大名,一直无缘得见,今日一见,信手一翻,对于求职的程序员来说的确是一本不错的书:)

下面就是朋友谈及的那个问题(括号中的中文是作者翻译的)

 

Tell me the difference in public inheirt and private inheit.

(公有继承和似有继承的区别是什么?)

A.      No difference

(没有区别)

B.      Private inherit will make every member form parent class into private.

(私有继承使父类的所有元素变成私有)

C.   Private inherit will make functions from parent class into private.

(私有继承使父类中的函数转化成私有)

D.      Private inherit make every member from parent not-accessible to sub-class.

(私有继承使父类中所有元素无法与子类联系)

 

书上给出的答案是D,但我认为B才是正确答案。

书上给出的解释是:

A肯定错。

因为子类只能继承父类的protected public,所以B也是错误的。

C的叙述不全面,而且父类可能有自己的私有方法成员,所以也是错误的。

 

由于C++博大精深,本人受学识所限,对于不同方式的继承有如下几点相关的认识:

(希望没有错误,经常发现多年形成的观点,最后竟然发现是错误的)

(1)私有继承:父类中的公有和保护成员成为子类的私有成员;

(2)保护继承:父类中的公有和保护成员成为子类的保护成员,父类中的私有成员在子类中不可访问;

(3)公有继承:父类中的公有和保护成员分别成为子类的公有和保护成员,父类的私有成员在子类中不可访问。

(4)一个类的成员对于其对象而言,公有成员可以访问,保护和私有成员,该类的对象是不能访问。

 

诚然,如书中所给出的解释“因为子类只能继承父类的protectedpublic,所以B也是错误的”,从这个意义上来讲,B的确是错误的。如果这个成立的话,那么这个题目应该就没有正确答案。B的英文正意,我觉得应该是“私有继承会使每个从父类继承而来的成员变成private”,而不是书本上作者给出的翻译,如果这个翻译是正确的,那么B就是唯一正确的答案。

 

从子类的内存布局上考虑,父类的私有成员实际上照样会在子类对象中出现,只是用通常的方法访问不到罢了,但至少有一种办法来访问,即通过指针的方式,即使父类的私有成员,在派生类中也是可以访问到,关于这点可以参考:http://blog.csdn.net/pathuang68/archive/2009/04/20/4096088.aspx

 

D的英文原意应该是“私有继承使得父类中的每个成员都不能被子类访问”,因此严格地说,在上面那篇文章提到的情形下,这是不对的。

 

虽然我认为 B 是正确的答案,但慑于《程序员面试宝典》的威名,因此不能 pretty sure ,希望能够得到各位硕学同仁的指教。

网站文章

  • ThinkPhp6、Laravel框架使用Ajax完成无刷新批量删除操作

    ThinkPhp6、Laravel框架使用Ajax完成无刷新批量删除操作

    TP 框架和 Laravel 框架使用 Ajax 完成批量删除几乎一模一样,两者并无太大区别 批量删除的要点就一点,获取到所选中的复选框的 ID,只要取到 ID,剩下的就好办了 完整代码在最下方 第一...

    2024-02-01 04:39:09
  • safari浏览器百度账号登陆"not_login"错误

    safari浏览器百度账号登陆"not_login"错误

    开发过程中使用百度clouda框架下的账号登陆接口

    2024-02-01 04:39:02
  • android----R8混淆编译

    android----R8混淆编译

    当gradle 版本在5.1.1及其以上(或许以下某个版本就支持了)使用了新的混淆、压缩编译方法——R8。在本地操作的时候,这没有任何问题,当使用自动化部署打包的时候——JENKINS。问题出来了,在R8编译这一过程就报错:Expiring Daemon because JVM Tenured space is exhaustedDaemon will be stopped at the ...

    2024-02-01 04:38:55
  • 数据库的基本语句(mysql举例)

    数据库的基本语句(mysql举例)

    一、基础的显示、建立、删除命令(对数据库和表) 1.显示数据库列表 show databases; 2.使用此数据库 use mysql; 3.显示库中的数据表 show tables; 4.显示数据...

    2024-02-01 04:38:26
  • javascript 数组转二维数组

    问题:有一个51个数的数组,每17个转换成一个数组,最终转换成一个二维数组 例子 var list = ["1101", "1102", "1103&...

    2024-02-01 04:38:21
  • PLSQL调试

    PLSQL调试

    以下文章:可以获取的内容,调PLSQL的行号,使用常用的快捷敲代码的方式(部分),初步调试存储过程,dual部分技巧,去重方式 1.调行号 tools(工具)----SQlWindow(窗口类型下)--show gutter line(显示行号) ,即可获得想要的行号 2.使用“字母+空格 ”比如说 sf 敲出“select * from ”,至于想要的什么样的输出...

    2024-02-01 04:38:14
  • 一套优雅的 Spring Boot + vue后台管理系统

    一套优雅的 Spring Boot + vue后台管理系统

    如何写一个优雅的项目?为了让更多人学习前后端分离项目,特意录制了一个基于Spring security + Jwt + Vue的前后端分离后台管理系统VueAdmin,手把手完整教学,另外...

    2024-02-01 04:38:08
  • 伪分布/集群搭建的详细过程

    伪分布/集群搭建的详细过程

    2024-02-01 04:37:42
  • solidity[1]-HelloWorld

    solidity介绍 以太坊拥有多种高级语言,可用于编写智能合约,每种语言都受到另一种广泛使用的语言的启发。最流行的一种叫做Solidity,它基于JavaScript。由于Solidity是迄今为止...

    2024-02-01 04:37:35
  • vite & FormData & mock,跨域&无法上传

    mock模式开启时,我这里是无法请求通过FormData,浏览器New Work上显示padding中,关闭mock后就可以了;

    2024-02-01 04:37:29