摩托罗拉部分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




