CC++经典面试50题
- 格式:docx
- 大小:24.98 KB
- 文档页数:15
1. 面向对象的程序设计思想是什么?答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。
2. 什么是类?答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类。
3. 对象都具有的二方面特征是什么?分别是什么含义?答:对象都具有的特征是:静态特征和动态特征。
静态特征是指能描述对象的一些属性,动态特征是指对象表现出来的行为4. 在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义?答:这样可以提高编译效率,避免重复编译。
因为分开的话只需要编译一次生成对应的.obj文件后,再次应用该类的地方,这个类就不会被再次编译,从而大大提高了效率。
5. 在类的内部定义成员函数的函数体,这种函数会具备那种属性?答:这种函数会自动为内联函数,这种函数在函数调用的地方在编译阶段都会进行代码替换。
6. 成员函数通过什么来区分不同对象的成员数据?为什么它能够区分?答:通过this指针来区分的,因为它指向的是对象的首地址。
7. C++编译器自动为类产生的四个缺省函数是什么?答: 1、默认构造函数,2、拷贝构造函数,3、赋值函数,4、析构函数。
8. 拷贝构造函数在哪几种情况下会被调用?答:1.当类的一个对象去初始化该类的另一个对象时;2.如果函数的形参是类的对象,调用函数进行形参和实参结合时;3.如果函数的返回值是类对象,函数调用完成返回时。
9. 构造函数与普通函数相比在形式上有什么不同?(构造函数的作用,它的声明形式来分析)答: 1)、构造函数是类的一种特殊成员函数,一般情况下,它是专门用来初始化对象成员变量的。
2)、构造函数的名字必须与类名相同3)、它不具有任何类型4)、不返回任何值。
10. 什么时候必须重写拷贝构造函数?答:当构造函数涉及到动态存储分配空间时,要自己写拷贝构造函数,并且要深拷贝。
11.构造函数的调用顺序是什么?答:1.先调用基类构造函数2.按声明顺序初始化数据成员3.最后调用自己的构造函数。
CC程序员应聘常见面试题深入剖析C/C++程序员面试技巧C/C++程序设计员应聘常见面试试题深入剖析本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。
文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。
企业要求面试者写一个最简单的trcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个trcpy函数吗我们都觉得自己能,可是我们写出的trcpy很可能只能拿到10分中的2分。
读者可从本文看到trcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。
此外,还有一些面试题考查面试者敏捷的思维能力。
分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。
2.找错题试题1:以下是引用片段:voidtet1(){chartring[10];char某tr1="0123456789";trcpy(tring,tr1);}试题2:以下是引用片段:voidtet2(){chartring[10],tr1[10];inti;for(i=0;i<10;i++){tr1='a';}trcpy(tring,tr1);}试题3:以下是引用片段:voidtet3(char某tr1)C/C++程序员面试技巧{chartring[10];if(trlen(tr1)<=10){trcpy(tring,tr1);}}解答:试题1字符串tr1需要11个字节才能存放下(包括末尾的\0),而tring只有10个字节的空间,trcpy会导致数组越界;对试题2,如果面试者指出字符数组tr1不能在数组内结束可以给3分;如果面试者指出trcpy(tring,tr1)调用使得从tr1内存起复制到tring内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数trcpy工作方式的给10分;对试题3,if(trlen(tr1)<=10)应改为if(trlen(tr1)<10),因为trlen的结果未统计\0所占用的1个字节。
CC++面试题大汇总C/C++面试题大汇总收藏最近因为找工作,收集了很多C语言方面方面的面试题以及答案。
现在新工作搞定了,决定把这些资料发出来,送给有需要的朋友,免得再象我一样到处搜寻,实在辛苦。
发布之前先申明两点:1 所有资料来自网络(主要是CSDN),本人只是收集和转发。
2所有问题解答(尤其是代码)只是参考,不保证正确。
先发基本问题,再发编程问题..........想成为嵌入式程序员应知道的0x10个基本问题:预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) #define语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3)意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4)如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A)<= (B) ? (A) : (B))这个测试是为下面的目的而设的:1)标识#define在宏中应用的基本知识。
这是很重要的。
因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。
这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
問題1 你為什麼覺得自己能夠在這個職位上取得成就? 分析 這是一個相當寬泛的問題,它給求職者提供了一個機會,可以讓求職者表明自己的熱情和挑戰欲。
對這個問題的回答將為面試人在判斷求職者是否對這個職位有足夠的動力和自信心方面提供關鍵資訊。
錯誤回答 我不知道。
我擅長做很多事情。
如果我能得到並且決定接受這份工作,我確信自己可以把它做得相當好,因為我過去一直都很成功。
評論 儘管表面上聽起來這種回答可以接受,但是它在幾個方面都有欠缺。
首先,這種語言很無力。
像“擅長做很多事情”以及“相當好”之類的話,都無法反映你的進取心,而如果不能表現出足夠的進取心,你就很難進入最好的企業。
另外,將過去做過的所有事情同這個職位聯繫起來,這意味著求職者對這一特定職位沒有足夠的成就欲望和真正的熱情。
【繁体转换简体方法】打开文档---菜单栏---审阅---繁转简---转换完成【简体转换繁体方法】打开文档---菜单栏---审阅---简转繁---转换完成 正確回答從我的經歷來看,這是我的職業生涯中最適合我的一份工作。
幾年來,我一直在研究這個領域並且關注貴公司,一直希望能有這樣的面試機會。
我擁有必備的技能(簡單講述一個故事來加以說明),我非常適合這一職位,也確實能做好這份工作。
評論這是一個很有說服力的回答,因為它可以告訴面試人,這個求職者擁有足夠的技能和知識來完成這項工作。
他所講的故事表明了求職者的技能,也驗證了他最初的陳述。
最後,求職者表示了“做好這份工作”的願望,這證明瞭他具備對這份工作的熱情和進取心。
問題2 你最大的長處和弱點分別是什麼?這些長處和弱點對你在企業的業績會有什麼樣的影響? 分析這個問題的最大陷阱在於,第一個問題實際上是兩個問題,而且還要加上一個後續問題。
這兩個問題的陷阱並不在於你是否能認真地看待自己的長處,也不在於你是否能正確認識自己的弱點。
記住,你的回答不僅是向面試人說明你的優勢和劣勢,也能在總體上表現你的價值觀和對自身價值的看法。
c c 面试题大汇总1.求下面函数的返回值( 微软)int func(x){int countx =0;while(x){countx ++;x = x&(x-1);}return countx;}假定x = 9999。
答案:8思路:将x转化为2进制,看含有的1的个数。
每取一次&会消去1个1;2. 什么是“引用”?申明和使用“引用”要注意哪些问题?1引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。
2申明一个引用的时候,切记要对其进行初始化。
引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。
3声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。
4不能建立数组的引用。
3. 将“引用”作为函数参数有哪些特点?(1)传递引用给函数与传递指针的效果是一样的。
这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。
因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。
而引用更容易使用,更清晰。
4. 在什么时候需要使用“常引用”?如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
50个经典面试问题1. 请告诉我自我介绍。
2. 为什么你对这个职位感兴趣?3. 你认为自己最大的优点是什么?4. 你认为自己最大的缺点是什么?5. 你在过去的工作经验中遇到过的最大挑战是什么?你是如何应对的?6. 你是如何处理工作压力的?7. 你对团队合作的看法是什么?8. 请分享你的领导能力经验。
9. 你如何与他人沟通和解决冲突?10. 你的职业目标是什么?11. 你如何评价自己的时间管理能力?12. 你在过去的工作中如何处理决策?13. 你如何处理工作中的变化和不确定性?14. 请分享你过去在一个团队中承担的项目。
15. 你如何帮助团队达成目标?16. 请分享你的创新思维经验。
17. 你遇到过的最困难的工作任务是什么?你是如何解决的?18. 你认为一个好的领导应具备什么特质?19. 你对失败的看法是什么?20. 你如何处理工作中的重要任务和紧急任务?21. 你在过去的工作经验中如何展示自己的团队合作能力?22. 你在团队中遇到过的最困难的人是什么样的?你是如何处理的?23. 请分享你在过去的工作中取得的最大成就。
24. 你如何看待反馈和批评?25. 你追求卓越的动力是什么?26. 请分享你在专业领域内的继续学习和发展经验。
27. 你如何处理和适应新技术和新工具?28. 你如何管理和平衡个人和工作生活?29. 你曾经在团队中面临的最大挑战是什么?你是如何克服的?30. 你如何评估自己的成功?31. 你认为一个好的团队应该具备什么特质?32. 你如何处理工作中的失败?33. 你如何处理工作中的冲突?34. 请分享你的人际关系技巧。
35. 你如何管理多个项目同时进行的情况?36. 请分享你在克服困难时的解决问题能力。
37. 你如何衡量和评估自己的工作进展?38. 你在过去的工作中如何根据反馈进行改进?39. 你如何与团队成员建立信任和合作关系?40. 你是如何管理自己的时间和任务的?41. 你曾经教导和培训过其他员工吗?请分享这个经历。
经典CC++面试题经典C/C++面试题1.介绍一下STL,详细说明STL如何实现vector。
Answer:STL (标准模版库,Standard Template Library)它由容器算法迭代器组成。
STL有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全和方便;即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。
vector实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。
2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。
Answer:在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。
一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
编程中经常能遇到LNK2005错误重复定义错误,其实LNK2005错误并不是一个很难解决的错误.3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。
在OOD,OOp中,组合优于继承.当然多态的基础是继承,没有继承多态无从谈起。
当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。
当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类.4.指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?(1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.(2) 不存在NULL引用,引用必须与合法的存储单元关联;而指针则可以是NULL.(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系.(4) 引用的创建和销毁并不会调用类的拷贝构造函数(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。
c c 经典面试题CC经典面试题在职场竞争激烈的今天,面试成为求职者们通往成功的必经之路。
而掌握一些经典面试题的答题技巧,无疑会让我们在面试中更加游刃有余。
本文将针对CC经典面试题,从不同的角度给出详细的答题解析和技巧,希望能够帮助广大求职者在面试中取得更好的成绩。
一、自我介绍自我介绍是面试过程中必不可少的环节,也是给面试官留下第一印象的机会。
在自我介绍时,我们要突出自己的核心竞争力,并结合职位需求进行宣示。
例如,我可以强调我的沟通能力、团队合作能力以及创新思维,在过去的工作中取得的成绩和实际案例来支持我的说法。
二、为什么想加入CC公司?这个问题考察的是我们的求职动机以及对公司的了解程度。
在回答这个问题时,我们要表达对CC公司的认同和向往,并且结合自身的职业发展规划来说明为什么选择CC公司。
例如,我可以说CC公司在行业内有着卓越的声誉和广阔的发展空间,我希望能够在这样的平台上不断提升自己,实现个人价值。
三、你认为自己的优点和缺点是什么?在回答这个问题时,我们要既展示自己的优点,又要真实地反映自己的缺点。
对于优点,我们可以选择符合岗位需求的特质,如自我驱动、学习能力强等。
对于缺点,我们可以选择不太影响工作的缺点,并表示对这些缺点的改进计划。
例如,我的优点是责任心强、善于学习,但缺点是对细节要求可能不够严谨,我正在通过定期培训和自我管理来弥补这方面的不足。
四、你在过去的工作中遇到的最大困难是什么?如何解决的?这个问题考察我们面对问题时的处理能力和解决问题的能力。
在回答时,我们可以选择挑选一个具体的案例,描述当时的背景、困难和解决方案,并强调自己的主动性和团队合作精神。
例如,在过去的项目中,我遇到了技术难关,我积极与团队成员合作,向领导请教,最终我们通过集思广益和分工合作解决了这个困难。
五、如果你在工作中发现同事在偷懒,你会怎么做?这个问题考察我们的道德底线和团队合作精神。
在回答时,我们可以表达对职业道德的坚守,并结合团队利益和个人发展角度来给出解决方案。
面试题3:sizeof和strlen的区别sizeof和strlen有以下区别:sizeof是一个操作符,strlen是库函数。
sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。
编译器在编译时就计算出了sizeof的结果。
而strlen函数必须在运行时才能计算出来。
并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。
数组做sizeof的参数不退化,传递给strlen就退化为指针了。
注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。
最容易混淆为函数的操作符就是sizeof。
strlen()与sizeof()考点,一步到位!看下msdn的官方解释:Strlen——Get the length of a string.size_t strlen( const char *string );Each ofthese functions returns the number of characters in string, notincluding the terminating null character.函数返回string里的字符数,不包括终止字符’\0’。
sizeof Operator 运算符sizeof expressionThe sizeof keyword gives the amount of storage, in bytes, associated with a variable or atype (including aggregate types). This keyword returns a value of type size_t.//返回变量或类型(包括集合类型)存储空间的大小,The expression is either an identifier or a type-cast expression (a type specifier enclosed inparentheses).When appliedto a structure type or variable,sizeof returns the actual size, whichmay include padding bytes inserted for alignment. When applied to a staticallydimensionedarray,sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or externalarrays.//应用结构体类型或变量的时候,sizeof()返回事实的大小,包括为对齐而填充字节。
当应用到静态数组时,sizeof()返回整个数组的大小。
sizeof()不会返回动态分配数组或扩展数组的大小。
char str[] = “Hello” ;char *p = str ;int n = 10;请计算sizeof (str) = //5+1=6 ,注意1代表'\0'容易落下,代表结束符。
str所占据的存储空间大小sizeof ( p )= //4指针类型sizeof ( n )= //4整形占据的存储空间void Func ( char str[100]){请计算sizeof( str ) = //4此时str转化为指针大小仍为4}void *p = malloc( 100 );请计算sizeof ( p ) = //4指针大小4面试题5:C中的malloc和C++中的new有什么区别malloc和new有以下不同:(1)new、delete是操作符,可以重载,只能在C++中使用。
(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。
(3)new可以调用对象的构造函数,对应的delete调用相应的析构函数。
(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。
注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用。
因为两者实现的机理不同。
面试题8:a和&a有什么区别请写出以下代码的打印结果,主要目的是考察a和&a的区别。
#include<stdio.h>void main( void){inta[5]={1,2,3,4,5};int*ptr=(int *)(&a+1); //此处&a是数组的指针,1实际1个数组长度 1*5*4 = 20个字节; int*ptr2 = (int *)(a+1);printf("%d,%d\n",*(a+1),*(ptr-1)); //printf("%d,%d\n",*(a+1),*(ptr2-1));}注意:数组名a可以作数组的首地址,而&a是数组的指针。
对比上两式子的不同。
&a+1,&a为代表a数组的指针,1根据&a变化代表了inta[5]数组的大小,为4*5=20个字节。
a+1, a代表数组a的首地址,1代表数组a中1个元素的长度,为4个字节。
int *ptr = (int *)(&a +1),代表ptr指向a数组20个字节后的一块内存区域,显然,该内存区域未定义,为一个随机值。
而*(ptr-1),此处ptr减去1*4个字节长度,ptr-1指向a[5],*(ptr-1)=a[5];而int *ptr2 = (int *)(a+1),代表指向数组首地址1*4个字节后元素,即a[1] =2;即ptr2指向a[2],此处的*a = *(a+0) = a[0], *(a+1) = a[1],依次类推。
面试题9:简述C、C++程序编译的内存分配情况C、C++中内存分配方式可以分为三种:(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。
速度快、不容易出错,因为有系统会善后。
例如全局变量,static变量等。
(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
工作中讨论问题都叫栈变量。
(3)从堆上分配:即动态内存分配。
程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由程序员决定,使用非常灵活。
如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。
一个C、C++程序编译时内存分为5大存储区:堆区、栈区、全局/静态区、文字常量(字符常量)区、程序代码区。
面试题11:设置地址为0x67a9的整型变量的值为0xaa66int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。
但是,此处的转换,编译没有问题,但是运行的时候可能会出错。
因为Ox67a9这块地址可能被占用……面试题13:C++的空类有哪些成员函数1)缺省构造函数。
2)缺省拷贝构造函数。
3)缺省析构函数。
4)缺省赋值运算符。
5)缺省取址运算符。
6)缺省取址运算符 const。
注意:有些书上只是简单的介绍了前四个函数。
没有提及后面这两个函数。
但后面这两个函数也是空类的默认函数。
另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。
面试题14:谈谈你对拷贝构造函数和赋值运算符的认识拷贝构造函数和赋值运算符重载有以下两个不同之处:(1)拷贝构造函数生成新的类对象,而赋值运算符不能。
(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。
而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。
面试题15:用C++设计一个不能被继承的类class A{private:A() {}~A() {}};class B : virtual public A{public:B(){}~B(){}};class C : virtual public B{public:C() {}~C() {}};void main( void ){B b;//C c;return;}注意:构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的。
此处,如果将父类构造函数写成私有的,便不能完成继承操作。
这是考察点。
面试题17:简述类成员函数的重写、重载和隐藏的区别(1)重写和重载主要有以下几点不同。
范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中。
参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同。
virtual的区别:重写的基类中被重写的函数必须要有virtual修饰,而重载函数和被重载函数可以被virtual修饰,也可以没有。
(2)隐藏和重写、重载有以下几点不同。
与重载的范围不同:和重写一样,隐藏函数和被隐藏函数不在同一个类中。
参数的区别:隐藏函数和被隐藏的函数的参数列表可以相同,也可不同,但是函数名肯定要相同。
当参数不相同时,无论基类中的参数是否被virtual修饰,基类的函数都是被隐藏,而不是被重写。
说明:虽然重载和覆盖都是实现多态的基础,但是两者实现的技术完全不相同,达到的目的也是完全不同的,覆盖是动态态绑定的多态,而重载是静态绑定的多态。
面试题18:简述多态实现的原理编译器发现一个类中有虚函数,便会立即为此类生成虚函数表vtable。
虚函数表的各表项为指向对应虚函数的指针。
编译器还会在此类中隐含插入一个指针vptr(对vc编译器来说,它插在类的第一个位置上)指向虚函数表。
调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向对应的vtabl e,将类与此类的vtable联系了起来。