CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

摩托罗拉部分C++面试题,如可能,请详解基类和子类在内存中的相互关系

楼主dawuzj(Aaron)2006-04-12 09:45:38 在 C/C++ / C++ 语言 提问

1.介绍一下STL,详细说明STL如何实现vector。  
  2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。  
  3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。  
  4.指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?  
  5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;  
  6.结合一个项目说明你怎样应用设计模式的理念。  
  7.介绍一下你对设计模式的理解。(这个过程中有很多很细节的问题随机问的)  
  8.C++和C定义结构的分别是什么。  
  9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?  
  10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。  
  11.结合1个你认为比较能体现OOP思想的项目,用UML来描述。(最好这个项目继承,多态,虚函数都有体现)这个问题大概会占面试时间的一半,并且会问很多问题,一不小心可能会被问住)。  
  12。基类的有1个虚函数,子类还需要申明为virtual吗?为什么。  
  13.C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗,难道仅仅是为实现重用。  
  14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。  
  15.为什么要引入抽象基类和纯虚函数?  
  16.介绍一下模板和包容器。如何实现?(也许会让你当场举例实现)  
  17.你如何理解MVC。简单举例来说明其应用。  
  18,多重继承如何消除向上继承的二义性。 问题点数:50、回复次数:48Top

1 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-04-12 09:49:37 得分 1

18道题至少也得180分吧...  
   
  顺便BS出第二个题的人.Top

2 楼dawuzj(Aaron)回复于 2006-04-12 09:52:02 得分 0

关于"14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。"  
  我好像在<高质量C++编程指南>第二版中看过,但现在书不在我手上了,请那位大详解一下.Top

3 楼dawuzj(Aaron)回复于 2006-04-12 09:54:56 得分 0

我手中分数不多,请大大原谅Top

4 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2006-04-12 09:55:38 得分 1

高质量C++编程指南???  
   
  强烈建议fangrk先生再次贴出那份经典的文章Top

5 楼dawuzj(Aaron)回复于 2006-04-12 10:07:00 得分 0

人气啊?!  
  请各位大大不要吝啬Top

6 楼kingsun555()回复于 2006-04-12 10:22:44 得分 1

基类和子类在内存中的相互关系.可以参看深度探索C++对象模型!Top

7 楼dawuzj(Aaron)回复于 2006-04-12 11:12:55 得分 0

谢谢这位大大了  
  谁可以用图形的方式表达一下,这样比较直观点?!Top

8 楼dawuzj(Aaron)回复于 2006-04-12 12:03:01 得分 0

再自己顶一下Top

9 楼paapa(爬啊爬)回复于 2006-04-12 12:42:51 得分 1

我帮你顶Top

10 楼firetoucher(风焱)回复于 2006-04-12 12:44:40 得分 0

Moto面试竟出如此题目,颓势可见一斑矣。  
   
  FT  
  --  
  Anything   one   man   can   imagine,   other   men   can   make   real.Top

11 楼dawuzj(Aaron)回复于 2006-04-12 12:44:56 得分 0

画出基类和子类在内存中的相互关系,比如有几个实例,画出它们的成员在内存中放置的位置,最好有虚成员,静态成员等.  
  这一问答对就给全分!Top

12 楼dawuzj(Aaron)回复于 2006-04-12 12:46:44 得分 0

楼上的都能答出来吗>一部分也行  
  你认为应该出什么样的题目>Top

13 楼beginnow()回复于 2006-04-12 12:57:41 得分 2

14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系  
   
  特点:继承,封装,多态.......  
  如何实现:   迟后编译  
  内存中的关系:(该问题重点是虚函数),通过virtual   table实现Top

14 楼dawuzj(Aaron)回复于 2006-04-12 13:33:19 得分 0

楼上的得两分Top

15 楼dawuzj(Aaron)回复于 2006-04-12 14:18:33 得分 0

画出基类和子类在内存中的相互关系,比如有几个实例,画出它们的成员在内存中放置的位置,最好有虚成员,静态成员等.  
  这一问答对就给全分!  
  Top

16 楼LiHubei(lhb)回复于 2006-04-12 15:09:42 得分 1

标志  
  Top

17 楼OOPhaisky(异化$渴望成功~~)回复于 2006-04-12 16:58:26 得分 1

不是不可以画出“基类和子类在内存中的相互关系”,关键情况很多,很复杂,要分为单继承,多继承,而且涉及到虚拟继承时,问题往往就发生变化了...Top

18 楼dawuzj(Aaron)回复于 2006-04-12 17:59:14 得分 0

各位了解多少就画多少,可以先从简单的结构开始!  
  人多力量大!Top

19 楼dawuzj(Aaron)回复于 2006-04-13 11:04:12 得分 0

???Top

20 楼cutenoob(cute )回复于 2006-04-13 13:10:40 得分 1

有意思...markTop

21 楼98440622(民工++)回复于 2006-04-13 14:42:29 得分 1

差距啊~~Top

22 楼badid()回复于 2006-04-13 15:09:35 得分 1

markTop

23 楼Jedimaster(CRH = 耻辱号)回复于 2006-04-13 15:41:12 得分 0

1   GP  
  2   refer   to   MSDN  
   
  懒得回答了  
   
  感觉都是书本的练习题目Top

24 楼sk_fault(晨光一线)回复于 2006-04-13 16:51:21 得分 1

dingTop

25 楼password636(亮)回复于 2006-04-13 16:54:52 得分 10

---------------------------------------                 低地址  
  |vptr                                                                     |  
  ---------------------------------------  
  |copy   base   class   nonstatic   data   members|  
  ---------------------------------------  
  |derived   class   nonstatic   data   members     |  
  ---------------------------------------                 高地址  
   
  以上是concrete继承的时候,子类对象在内存中的模型(VC中),其中vptr在有虚拟函数的时候存在。  
  对一个父类和一个子类的情况:  
  如果父类和子类都没有虚拟函数,那么模型中就没有vptr  
  父类有虚拟函数,子类没有,那这里的vptr就是父类的  
  父类没有虚拟函数,子类有,那这里的vptr就是子类的,vc把vptr放在模型的最前面,不同的编译器实现不同。  
   
  如果多个父类,一个子类,那么按照继承顺序,如class   derived   :   public   base1,   public   base2...这样,并且父类中有若干个存在虚拟函数,那么模型中的vptr就是第一个出现的父类的模型中的vptr,其它后继出现的父类的vptr和子类的都在这个vptr中扩展,这样,在最终子类的模型中总是只有一个vptr,而各父类的nonstatic   data   members按继承顺序排在vptr之后。  
   
  至于虚拟继承,concrete继承复杂,不过最主要的就是当出现这样的情况的时候:  
  一个父类A有2个虚拟派生的子类B1和B2,这2个子类又都是一个类C的父类(这里是concrete继承),那么这个C类里不会有2份A的nonstatic   data   members的拷贝,只有一份。这是因为A类派生B1和B2的时候是虚拟继承,如果是concrete继承,那C就会有2份A的拷贝。虚拟继承的实现方式,不同的编译器实现不同,有种是通过指针来指示,这样当共同派生一个子类的时候,可以消除冗余。  
  如标准库里的io库,ios的两个子类istream和ostream,还有istream和ostream的子类iostream就是这样的情况。  
  Top

26 楼eikoor(由java专VC -_-!!!)回复于 2006-04-13 19:10:51 得分 1

唉   这些题感觉自己大部分了解    
  可是真要在面试的时候说清楚     不之前好好准备一下   一定会被bs的  
  有没有高手给总结一下答案Top

27 楼kangji(尾鱼头)回复于 2006-04-13 19:30:53 得分 1

靠,这些题目写完答案可以出版一本小书了Top

28 楼lonelyforest(一生所爱)回复于 2006-04-13 19:45:30 得分 0

觉得第二道题目不好!!  
   
  Top

29 楼lemon_1104()回复于 2006-04-13 20:03:15 得分 1

先记一下,慢慢看Top

30 楼crescentg(我找不到改昵称的地方了,谁教教我呀)回复于 2006-04-13 20:31:01 得分 1

markTop

31 楼xibeilang99(天狼星)回复于 2006-04-13 21:05:07 得分 1

真的假的?太多了吧!Top

32 楼dylin(家住红灯区,市府前)回复于 2006-04-14 01:26:29 得分 1

markTop

33 楼HopeInDark(子弹)回复于 2006-04-14 10:51:20 得分 1

markTop

34 楼wu19821214(狗)回复于 2006-04-14 15:00:10 得分 1

期待高手  
  Top

35 楼romanticlife(充满生活的味道)回复于 2006-04-14 16:56:38 得分 0

@~@Top

36 楼YufengShi(浪子)回复于 2006-04-14 17:11:54 得分 0

不错的题目,要总结齐这些答案,不是三言两语....Top

37 楼adam2002(adam2002)回复于 2006-04-15 14:18:33 得分 0

markTop

38 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-04-15 14:25:55 得分 0

全部都在         高质量C++编程指南     这本书中  
    看来这也是一个窍门呀  
        Jinhao(辣子鸡丁·GAME就这样OVER了)     看完了?????Top

39 楼wille_wang(禾禾)回复于 2006-04-15 14:47:23 得分 0

学习中Top

40 楼nanhu_007(物是人非)回复于 2006-04-15 21:20:27 得分 0

“3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。”  
  这里“委派”是指什么啊?组合吗?Top

41 楼stonepeter(笨笨石头.NET_从公务员转身成为了程序员)回复于 2006-04-15 22:13:10 得分 0

路过、Top

42 楼lihao95808()回复于 2006-04-16 10:55:33 得分 0

题目都很具有代表性啊Top

43 楼ariesheen(卢仁嘉)回复于 2006-04-16 17:36:02 得分 0

有几道面试见过的Top

44 楼Youthllen()回复于 2006-04-16 19:44:47 得分 10

#include   <iostream.h>  
  #include   <stdio.h>  
  class   ClassA  
  {  
  public:  
  static   int   m_staticData;  
  int   m_data1;  
  int   m_data2;  
   
  void   func1()   {   }  
  void   func2()   {     }  
  virtual   void   vfunc1()   {     }  
  virtual   void   vfunc2()   {     }  
  ClassA(){m_data1   =   1;m_data2   =   2;m_dataPrivate3   =   3;m_dataPrivate4   =   4; }  
  private:    
  int   m_dataPrivate3;  
  int   m_dataPrivate4;  
  };  
   
  class   ClassB   :   public   ClassA  
  {  
  public:  
  int   m_data3;  
  void   func2()   {     }  
  void   vfunc3()   {     }  
  void   vfunc4()   {     }  
  };  
   
  class   ClassC   :   public   ClassB  
  {  
  public:  
  int   m_data1;  
  int   m_data4;  
  void   func2()   {       }  
  virtual   void   vfunc1()   {     }  
  };  
   
  void   main(   )  
  {  
  cout   <<   "size   of   ClassA:     "<<   sizeof(ClassA)   <<   endl;  
  cout   <<   "size   of   ClassB:     "<<   sizeof(ClassB)   <<   endl;  
  cout   <<   "size   of   ClassC:     "<<   sizeof(ClassC)   <<   endl;  
   
  ClassA   a;  
  ClassB   b;  
  ClassC   c;  
  cout   <<   "size   of   ClassA     a:     "<<   sizeof(a)   <<   endl;  
  cout   <<   "size   of   ClassB     b:     "<<   sizeof(b)   <<   endl;  
  cout   <<   "size   of   ClassC     c:     "<<   sizeof(c)   <<   endl;  
   
  b.m_data1   =   11;  
  b.m_data2   =   22;  
  b.m_data3   =   33;  
   
  c.m_data1   =   111;  
  c.ClassA::m_data1   =   112;    
  c.m_data2   =   222;  
  c.m_data3   =   333;  
  c.m_data4   =   444;  
   
   
  cout   <<   "classb   data:   "   <<   endl   ;  
  cout   <<   "b.m_data1:   "   <<b.m_data1   <<   endl   ;  
  cout   <<   "b.m_data2:   "<<   b.m_data2   <<   endl   ;  
  cout   <<   "b.m_data3:   "<<   b.m_data3   <<   endl   ;  
  // b.m_staticData   =   1;  
  // cout   <<   "b.m_staticData"<<   b.ClassA::m_staticData   <<endl   ;      
  //编译通过,但会有连接错误。  
   
  cout   <<   "classc"   <<   endl   ;  
  cout   <<   "c.m_data1:   "     <<   c.m_data1   <<   endl   ;  
  cout   <<   "c.ClassA::m_data1:   "   <<   c.ClassA::m_data1<<   endl   ;  
  cout   <<   "c.m_data2:   "   <<   c.m_data2   <<   endl   ;  
  cout   <<   "c.m_data3:   "   <<   c.m_data3 <<   endl   ;  
  cout   <<   "c.m_data4:   "   <<   c.m_data4 <<   endl   ;  
   
   
  cout   <<   "\nclassb   address"   <<   endl   ;  
  cout   <<   &b   <<   endl   ;  
  cout   <<   &(b.m_data1)   <<   endl   ;  
  cout   <<   &(b.m_data2)   <<   endl   ;  
  cout   <<   &(b.m_data2)+1   <<":   ClassA     m_dataPrivate3     is   "<<*(&(b.m_data2)   +   1)<<   endl   ;  
  cout   <<   &(b.m_data2)+2   <<":   ClassA     m_dataPrivate4     is   "<<*(&(b.m_data2)   +   2)<<   endl   ;  
   
  cout   <<   "\nclassc   address"   <<   endl   ;  
  cout   <<   &c   <<   endl   ;  
  cout   <<   &(c.m_data1)   <<   endl   ;  
  cout   <<   &(c.m_data2)   <<   endl   ;  
  cout   <<   &(c.m_data3)   <<   endl   ;  
  cout   <<   &(c.m_data4)   <<   endl   ;  
  cout   <<   &(c.ClassA::m_data1)   <<   endl   ;  
  }  
   
  Top

45 楼Youthllen()回复于 2006-04-16 19:47:42 得分 10

这是我最近学c++的一些理解,不知道对不对,各位大虾指教:  
   
  (1)     ClassA   里面的m_staticData   的存储空间是分配在静态数据区的。  
  如:在ClassA增加了一个static   int   m_staticData   ,     sizeof(ClassA)或sizeof(a)和不加前是一样的。  
   
  (2)     static   类型变量   ,是不能被继承的。  
  引用b.m_staticData不能通过连接,  
  b.ClassA::m_staticData的引用也不能通过连接。  
   
  (3)   父类其他的变量无论是public   protected   还是private   型的在内存分配上都被子类继承过来了,我们可以看到       sizeof(ClassB)   =   sizeof(ClassA)   +   sizeof(m_data3)。  
   
  (4)      
  当子类定义的变量与基类同名时,如果父类的这个变量在子类中是可见的,则在访问上被覆盖。  
  如:c.m_data1   =   111;   c.ClassA::m_data1   =   112;    
  然而,可以看出在内存上仍然是两快不同的空间保存的。  
   
  (5)     即便父类的变量在子类中不可见,它在子类的实例中仍然是分配了内存了的,甚至是被初始化过的。       下面的代码就访问到了父类中两个私有变量。  
  cout   <<   &(b.m_data2)+1<<":   ClassA     m_dataPrivate3     is   "<<*(&(b.m_data2)   +   1)<<endl;  
  cout   <<   &(b.m_data2)+2<<":   ClassA     m_dataPrivate4     is   "<<*(&(b.m_data2)   +   2)<<endl;  
   
  (6)  
  变量的地址安排是按定义的顺序来的,并且先父类再子类。如   ClassB   中的地址是这样安排的:  
  虚函数表指针   __vfptr                         4byte       (如果父类子类中都没有虚函数就没有这个指针)  
  父类ClassA中   m_data1                         4byte         (子类可见)  
  父类ClassA中   m_data2                         4byte         (子类可见)  
  父类ClassA中   m_dataPrivate3           4byte         (子类不可见)  
  父类ClassA中   m_dataPrivate3           4byte         (子类不可见)  
  子类ClassB中   m_data3                         4byte  
  所以sizeof(ClassB)   =   24;  
   
  (7)对于一个类来说,他的函数是其各个实例共享的,而变量则是每个实例都有单独的一份。   
  关于继承的中的虚函数:由一个虚函数表指针   __vfptr 来维护。这个表里面纪录了各个虚函数代码段的地址。  
  我们可以设断点察看&a   &b   &c中的__vfptr,如果子类重载了父类的虚函数则相应的函数地址改变,否则仍然指向父类的虚函数代码段地址。Top

46 楼manplus(魅力加加)回复于 2006-04-19 13:38:27 得分 0

mrTop

47 楼SammyLan((基础决定你能走多远)--英语菜才是真的菜)回复于 2006-04-20 00:22:00 得分 0

收藏  
  难道又要扣我2分信誉分   (=_=)Top

48 楼xingzhao_m()回复于 2006-04-20 00:54:54 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:dawuzj
  • healer_kx
  • Jinhao
  • kingsun555
  • paapa
  • beginnow
  • LiHubei
  • OOPhaisky
  • cutenoob
  • 98440622
  • badid
  • sk_fault
  • password636
  • eikoor
  • kangji
  • lemon_1104
  • crescentg
  • xibeilang99
  • dylin
  • HopeInDark
  • wu19821214
  • Youthllen
  • Youthllen

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo