首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

蛋痛的c++ 面试

2012-08-03 
蛋疼的c++ 面试今天去一家公司面试,问了几个c++的问题,结果就直接被刷了1.c++虚函数c++虚函数保存在哪里?

蛋疼的c++ 面试
今天去一家公司面试,问了几个c++的问题,结果就直接被刷了
1.c++虚函数
c++虚函数保存在哪里?在保存在对像的开始、末尾还是中间?
 不知道 
一个类继承自两个类,虚表的情况是什么样的?
 这个子类会存在两个虚表(这个应该没记错吧)
一定会存在两个虚表吗?
这就不清楚了(既然他继续追问,应该有某种情况只会有一个虚表吧,当时没想到就直接说不清楚了。在回来的路上想了下,可能棱形继承的时候不会存在两个虚表吧)

2.类A的定义如下:
class A
{
  static void f1(){};
  void f2(){};
}
执行下列代码后,会出现什么现象:
 A *a = NULL;
 a->f1();
 a->f2();

a->f2()
调用肯定会出错的,关键是静态函数f1,当时不确定a->f1会不会出错,就直接说这句不太确定了。实际当中,都直接用A:f1()来调用了,谁会这样调用呢?后来回想了下,a->f1()不会出错的理由可能是,编译器处理了这种情况。

以前也看过c++对象模型,但现在细节记不清了。问这些问题有个蛋用啊?


[解决办法]
基本上,这种装B单位,就别去浪费生命了。
[解决办法]
不过现在的公司都喜欢面试这种题目么?这种题目有时候是和编译器有关的...
[解决办法]
我觉得这些不能算基础,应该叫变态题

[解决办法]

探讨

c++只是一门语言而已,用它是来解决实际问题,又不是应聘做编译器/调试器的

[解决办法]
总的来说,这玩意没有标准.可以随意发挥.但这些题目出得有炫技的嫌疑.

出这种题基本上是想考查面试人员对C++以及计算机的认识深度.
一般情况,我会让面试者自己设计一些方案,以达成这些特性.并不一定是哪一种编译器的解决方案.
比如:第一题我会改成 C++中虚函数有什么特性?它们是如何实现的?或者让你来设计编译器,你怎么实现这些特性?
[解决办法]
关于虚函数,第一个问题,lz就说不会了。还追着这个知识点问,能问出什么来,想装b,想疯了吧

lz倒霉,遇到个小白面试官,呵呵呵
[解决办法]
无聊的面试题目,这种知识实际上用处很小,没事考这个干什么
[解决办法]
呵呵,这题目,我去面试还差不多。

这东西知道是有用,主要就是用在有莫名其妙崩溃的时候,但是,前提也得是结合汇编。不懂汇编也是白费。

对于上层写逻辑的程序来说真的几乎都不知道这些。当然,不知道也是一样可以写的。
[解决办法]
探讨
今天去一家公司面试,问了几个c++的问题,结果就直接被刷了
1.c++虚函数
c++虚函数保存在哪里?在保存在对像的开始、末尾还是中间?
 不知道 
一个类继承自两个类,虚表的情况是什么样的?
这个子类会存在两个虚表(这个应该没记错吧)
一定会存在两个虚表吗?
这就不清楚了(既然他继续追问,应该有某种情况只会有一个虚表吧,当时没想到就直接说不清楚了。在回来的路上想了下,可能棱形继承的……

[解决办法]
蛋疼的公司……
[解决办法]
A *a = NULL;
 a->f1();
 a->f2();
都对
[解决办法]
我的答案:
1. C++的虚函数保存在虚表中,现代的编译器一般会把虚表保存在this指针的最前面(单一继承)
 一个类继承两个类,虚表可能没有,也可能有一个,也可能有两个,完全看基类是否有虚函数
如果两个基类都有虚函数(且不为空),则第一个虚表保存在this指针的最前面,第二个虚表保存在this+sizeof(CBase1)+对齐的地方
2.
 A *a = NULL;
 a->f1();
 a->f2();
 f1(),f2()都什么也没干,肯定没问题了

探讨
今天去一家公司面试,问了几个c++的问题,结果就直接被刷了
1.c++虚函数
c++虚函数保存在哪里?在保存在对像的开始、末尾还是中间?
 不知道 
一个类继承自两个类,虚表的情况是什么样的?
这个子类会存在两个虚表(这个应该没记错吧)
一定会存在两个虚表吗?
这就不清楚了(既然他继续追问,应该有某种情况只会有一个虚表吧,当时没想到就直接说不清楚了。在回来的路上想了下,可能棱形继承的……

[解决办法]
我记得a->f2()只要不访问到成员变量就不会出错
[解决办法]
第二题,应该都可以吧,一般编译器都不会去检查a是否为空,这开销太大了。如果编译器严格的话也是有可能的。
[解决办法]
楼主啊,你的C++确实学得不好,不过呢,我还是求给分。那问题的答案如下:
1,虚函数在C++里面只有index,这个index指示它在virtual table中的地址索引,那个virtual table里面装的就是虚函数的地址哦,一个类如果有虚表的话,它的对象里面就会有一个虚表指针指向虚表,这个指针有时位于开头(VS),有时位于末尾(GCC).


另外,如果继续了两个类的话,这个类不一定有两个虚表,只有当这两个类都有虚表的情况下这个类才会有两个虚表,当然,如果是虚拟继承的话可能还会有虚拟继承指针(这个就不算虚表指针了)

2,这个问题是那两个调用都合法,static函数可以通过对象调用,而且以前的C++标准规定任何函数都要通过对象调用,所以存在((A*)(0))->f1()这种写法


求楼主给分,给分是好人,好人一生平安
[解决办法]
问题 2: 可以直接看反汇编
a->f2();
004114F2 mov ecx,dword ptr [a] ; 传NULL到ecx
004114F5 call A::f2 (411285h) ; 直接调用f2()代码

可以看到 f2()内部没有调用类的任何东东,当然不会报错哦。

热点排行
Bad Request.