蛋疼的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++中虚函数有什么特性?它们是如何实现的?或者让你来设计编译器,你怎么实现这些特性?
[解决办法]关于虚函数,第一个问题,lz就说不会了。还追着这个知识点问,能问出什么来,想装b,想疯了吧
lz倒霉,遇到个小白面试官,呵呵呵
[解决办法]无聊的面试题目,这种知识实际上用处很小,没事考这个干什么
[解决办法]呵呵,这题目,我去面试还差不多。
这东西知道是有用,主要就是用在有莫名其妙崩溃的时候,但是,前提也得是结合汇编。不懂汇编也是白费。
对于上层写逻辑的程序来说真的几乎都不知道这些。当然,不知道也是一样可以写的。
[解决办法][解决办法]蛋疼的公司……
[解决办法] A *a = NULL;
a->f1();
a->f2();
都对
[解决办法]我的答案:
1. C++的虚函数保存在虚表中,现代的编译器一般会把虚表保存在this指针的最前面(单一继承)
一个类继承两个类,虚表可能没有,也可能有一个,也可能有两个,完全看基类是否有虚函数
如果两个基类都有虚函数(且不为空),则第一个虚表保存在this指针的最前面,第二个虚表保存在this+sizeof(CBase1)+对齐的地方
2.
A *a = NULL;
a->f1();
a->f2();
f1(),f2()都什么也没干,肯定没问题了
[解决办法]我记得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()内部没有调用类的任何东东,当然不会报错哦。