亚马逊二面的面试题

wutongye 2012-10-07 03:53:10
27号进行了亚马逊的二面,面试官给了几个题,主要考察虚继承的知识点,让我直接写出输出结果,并解释为什么,实在是搞不懂啊,大家共同来思考一下啊,记得写出你的原因,思考下为什么?这个面试官很看重的。
class A
{
virtual void a()
{
}
};
class A1
{
virtual void a()
{
}
};

class B : public A , virtual public A1
{
};
void main()
{
cout<<sizeof(B)<<endl; //
}




class A
{
int a;
};
class B
{
int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
cout<<sizeof(E)<<endl; //
}



class A
{
};
class B
{
int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
cout<<sizeof(E)<<endl; //
}





class A
{
int a;
};
class B
{
int b;
};

class C
{
};
class E: public virtual A , public virtual B , public virtual C
{
};
void main()
{
cout<<sizeof(E)<<endl; //
}


亚马逊三面的面试题
...全文
5755 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-09-16
  • 打赏
  • 举报
回复
引用 37 楼 eagleatustb 的回复:
看下对象模型,字节对齐,就解决问题了。 另外,BS一下动不动就说int或是指针是4个字节的人。。。不看看是多少位的CPU,64们CPU,16位CPU也是4字节?还有,在VC里,#pragma pack(8)后的32位CPU里的int还是4个字节吗?
++ C51 8Bits CPU,有1,2,3字节,3种指针 DOS 16 Bits,有远近两种指针,远4字节,近2字节 Windows 32 Bits 本应该有 4字节,6字节两种指针,或者4字节,8字节两种指针的,不过 MS只提供一种内存模式,所以只有1种指针4字节 64 BITS,没有用过,不知道,应该 8字节
vita6 2013-09-13
  • 打赏
  • 举报
回复
amazon现在有很多职位在open 感兴趣请联系我 http://blog.sina.com.cn/s/blog_7e6edac50101ell4.html
Defonds 2012-10-14
  • 打赏
  • 举报
回复
亚马逊的面试题
deping_chen 2012-10-14
  • 打赏
  • 举报
回复
初学C十十的时候,我肯定会做。Amazon是要排斥有经验的程序员吗?
丰清云淡 2012-10-13
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]
class E: public virtual A , public virtual B , public virtual C , public virtual D
这里的virtual有什么特殊用处吗?
[/Quote]
virtual 继承会带来额外的开销。实际编程估计都不这样用,感觉Amazon的题目很学院派。
H美好未来H 2012-10-13
  • 打赏
  • 举报
回复
class E: public virtual A , public virtual B , public virtual C , public virtual D
这里的virtual有什么特殊用处吗?
ctreewang 2012-10-13
  • 打赏
  • 举报
回复
少继承,多组合,反正,我本来就反对多重继承,看到虚多重继承,我立马喷了,我看不出结果,我只有拿编译器编译了。

12 16 12 12
苍穹浪 2012-10-12
  • 打赏
  • 举报
回复
//c++
嵌入式开发?操作底层应该和其他逻辑解耦:不需要考虑这个问题;
所以该问题无讨论意义,你只需要知道虚函数和虚继承是需要成本的。如果因为C++的继承机制对系统性能影响过大,那就要考虑你的系统框架或者这个工程就不应该使用C++了。
eagleatustb 2012-10-12
  • 打赏
  • 举报
回复
看下对象模型,字节对齐,就解决问题了。
另外,BS一下动不动就说int或是指针是4个字节的人。。。不看看是多少位的CPU,64们CPU,16位CPU也是4字节?还有,在VC里,#pragma pack(8)后的32位CPU里的int还是4个字节吗?
丰清云淡 2012-10-12
  • 打赏
  • 举报
回复
这里仅对12、16、12、12这种结果进行分析:

class A
{
virtual void a()
{
}
};
class A1
{
virtual void a()
{
}
};

class B : public A , virtual public A1
{
};

void main()
{
cout<<sizeof(B)<<endl; //BCB结果12 ,在B的内存模型中,base class A subobject

4个字节(虚函数表指针),virtual class B subobject 4个字节(虚函数表指针),class B另外在后

面安插一个vptr指向虚函数表
}

class A
{
int a;
};
class B
{
int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
cout<<sizeof(E)<<endl; //BCB结果16 ,在B的内存模型中,base class A subobject

4个字节(int),virtual class B subobject 4个字节(int),继承或多重继承下空类大小为1个字节

,对齐3字节,总为4字节,class E后面安插一个vptr(4Byte)指向虚函数表()。
}

class A
{
};
class B
{
int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
cout<<sizeof(E)<<endl; //BCB结果12,virtual base class B 4字节(int),继承或多重继承,空类大 小为1Byte,对齐3字节,总为4字节,后面安插vptr指向虚函数表。
}


class A
{
int a;
};
class B
{
int b;
};

class C
{
};
class E: public virtual A , public virtual B , public virtual C
{
};
void main()
{
cout<<sizeof(E)<<endl; //结果12,virtual base class A subobject 4字节(int),viftual base class B subobject 4字节(int)。后面安插vptr(4 Byte)指向虚函数表。总计12Btye
}

注意:
1:空类之所以会安插一个char,是为了区分不同对象而考虑的,在第四种情况,由于虚继承C后未再继承其它空类,因此不提供额外的char。此处第二和第三种情况均要用于区分C、D空类对象。
2:虚函数表指针和编译器实现有关,有的编译器会有多个虚函数表指针,这里构造虚函数表,分两部分,前半部分为虚拟基类指针构成的表,后半部分为虚函数指针构成的表,构造时,此指针指向索引为0的位置,举例(第三题)如下:
--------------------
-4 ---------> class D
--------------------
-3 ---------> class C
--------------------
-2 ---------> class B
--------------------
-1 ---------> class A
vptr --> --------------------
0 ---------> virtual functionA:如果存在
--------------------
丰清云淡 2012-10-12
  • 打赏
  • 举报
回复
这里仅对12、16、12、12这种结果进行分析:
class A
{
virtual void a()
{
}
};
class A1
{
virtual void a()
{
}
};

class B : public A , virtual public A1
{
};
void main()
{
cout<<sizeof(B)<<endl; //BCB结果12 ,在B的内存模型中,base class A subobject

4个字节(虚函数表指针),virtual class B subobject 4个字节(虚函数表指针),class B另外在后

面安插一个vptr指向虚函数表
}

class A
{
int a;
};
class B
{
int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
cout<<sizeof(E)<<endl; //BCB结果16 ,在B的内存模型中,base class A subobject

4个字节(int),virtual class B subobject 4个字节(int),继承或多重继承下空类大小为1个字节

,对齐3字节,总为4字节,class E后面安插一个vptr(4Byte)指向虚函数表()。
}

class A
{
};
class B
{
int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
cout<<sizeof(E)<<endl; //BCB结果12,virtual base class B 4字节(int),继承或多重继承,空类大小为1Byte,对齐3字节,总为4字节,后面安插vptr指向虚函数表。
}


class A
{
int a;
};
class B
{
int b;
};

class C
{
};
class E: public virtual A , public virtual B , public virtual C
{
};
void main()
{
cout<<sizeof(E)<<endl; //结果12,virtual base class A subobject 4字节

(int),viftual base class B subobject 4字节(int)。后面安插vptr(4 Byte)指向虚函数表。总计12Btye
}

注意:
1:空类之所以会安插一个char,是为了区分不同对象而考虑的,在第四种情况,由于虚继承C后未再继承其它空类,因此不提供额外的char。此处第二和第三种情况均要用于区分C、D空类对象。
2:虚函数表指针和编译器实现有关,有的编译器会有多个虚函数表指针,这里构造虚函数表,分两部分,前半部分为虚拟基类指针构成的表,后半部分为虚函数指针构成的表,构造时,此指针指向索引为0的位置,举例(第三题)如下:
--------------------
-4 ---------> class D
--------------------
-3 ---------> class C
--------------------
-2 ---------> class B
--------------------
-1 ---------> class A
vptr --> --------------------
0 ---------> virtual functionA:如果存在
--------------------
mcrovc_mfc 2012-10-11
  • 打赏
  • 举报
回复
虚继承啊啊
Flammable_ice 2012-10-11
  • 打赏
  • 举报
回复
亚马逊二面的关于虚函数的题,在实际工作中,有何用哦?是秀技术?感觉出题的有点像学院派。
景荣1 2012-10-11
  • 打赏
  • 举报
回复
这玩意就像火影中大蛇丸练的东西一样,都是禁术,拿来面试有点那个了
qiminixi 2012-10-10
  • 打赏
  • 举报
回复
看来老外的要求比国内的要高得多啊,我得好好补补基础,多谢你的帖子。
popy007 2012-10-10
  • 打赏
  • 举报
回复
这个要看

1 compiler对empty virtual base class的支持如何
2 机器的地址位数
3 地址对齐字节数

可以把2、3项进行假设(比如32-bit机器4字节对齐),然后针对1进行两种情况分析。。。
Emiyasstar__ 2012-10-10
  • 打赏
  • 举报
回复
看到虚拟继承我蛋就碎了
品茶 2012-10-10
  • 打赏
  • 举报
回复
1L正解
多重继承用的再好也是......
大方向就错了
audi2 2012-10-10
  • 打赏
  • 举报
回复
同意16楼。
《深入c++对象模型》Inside C++ Object Model
fullisnull 2012-10-10
  • 打赏
  • 举报
回复
这题目很简单的,仔细理解的话,不过还需要注意一下32/64位的区别。
加载更多回复(23)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧