热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

1.介绍一下STL,详细说明STL如何实现vector。2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。3.继承和委派有什么分别,在决定使用
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,多重继承如何消除向上继承的二义性。

48 个解决方案

#1


18道题至少也得180分吧...

顺便BS出第二个题的人.

#2


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

#3


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

#4


高质量C++编程指南???

强烈建议fangrk先生再次贴出那份经典的文章

#5


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

#6


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

#7


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

#8


再自己顶一下

#9


我帮你顶

#10


Moto面试竟出如此题目,颓势可见一斑矣。

FT
--
Anything one man can imagine, other men can make real.

#11


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

#12


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

#13


14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系

特点:继承,封装,多态.......
如何实现: 迟后编译
内存中的关系:(该问题重点是虚函数),通过virtual table实现

#14


楼上的得两分

#15


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

#16


标志

#17


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

#18


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

#19


???

#20


有意思...mark

#21


差距啊~~

#22


mark

#23


1 GP
2 refer to MSDN

懒得回答了

感觉都是书本的练习题目

#24


ding

#25


---------------------------------------        低地址
|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就是这样的情况。

#26


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

#27


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

#28


觉得第二道题目不好!!

#29


先记一下,慢慢看

#30


mark

#31


真的假的?太多了吧!

#32


mark

#33


mark

#34


期待高手

#35


@~@

#36


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

#37


mark

#38


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

#39


学习中

#40


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

#41


路过、

#42


题目都很具有代表性啊

#43


有几道面试见过的

#44


#include 
#include 
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: " < 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 < //编译通过,但会有连接错误。

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 ;
}

#45


这是我最近学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)< cout << &(b.m_data2)+2<<": ClassA  m_dataPrivate4  is "<<*(&(b.m_data2) + 2)<
(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,如果子类重载了父类的虚函数则相应的函数地址改变,否则仍然指向父类的虚函数代码段地址。

#46


mr

#47


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

#48


mark

推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
qwqwd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有