C++ 具有虚拟析构函数的派生类的Sizeof
在求职面试中,我被这个问题弄得不知所措: bool Res-它向我们展示了什么C++ 具有虚拟析构函数的派生类的Sizeof,c++,C++,在求职面试中,我被这个问题弄得不知所措: bool Res-它向我们展示了什么 template <class T> class R { class A: public T { virtual ~A(){} }; public: static const bool Res = sizeof(A) == sizeof(T); }; 模板 R类 { 甲级:公共交通{ 虚拟~A(){} }; 公众: 静态常数
template <class T>
class R
{
class A: public T {
virtual ~A(){}
};
public:
static const bool Res = sizeof(A) == sizeof(T);
};
模板
R类
{
甲级:公共交通{
虚拟~A(){}
};
公众:
静态常数bool Res=sizeof(A)==sizeof(T);
};
在我的调查过程中,我一直认为sizeof(T)=1,而sizeof(A)是变化的。非常感谢您的解释。如果T是多态类(具有虚拟析构函数或任何虚拟方法),则大小应该相同
如果T不是多态的(没有任何虚拟方法),则通过指向虚拟函数表的指针,A的大小会更大
编辑。
进一步解释:如果一个类有任何虚方法(这意味着它被设计为多态使用),它必须有一个指向虚函数表的指针,当调用虚方法时,它被用来确定究竟应该使用哪种方法。 < p>值>代码> RES/COD>应表明,
- 如果
确实具有T
功能,virtual
不会向表示添加任何内容,并且可以与a
大小相同T
- 如果
没有T
函数,virtual
可能会添加一些东西来处理动态调度(通常是指向类似a
函数指针表的指针),并且具有不同的大小virtual
一个有趣的问题是编译器是否能检测到
R::a
不能用于继承,因此,决定它实际上不需要虚拟
函数指针。我敢肯定,编译器可以这样做,从而使R::Res
的值变得更加可疑。尝试向T
sizeof(R)
添加一个虚拟函数并不有趣。R::A的大小是多少?这是一个有趣的问题,但在求职面试中没有这个位置。一些软件开发公司真的疯了。这在一定程度上取决于如何评估答案。这里的示例:您可以提到,使用vtable实现虚拟功能的标准并不能保证这一点。虽然在实践中,这没有关系。@DanielJour你当然是对的,谢谢。我不会更改它,因为它已经在公认的答案中得到了更好的解释。@starllight:为什么您会对R
的大小感兴趣?您对值R::Res
或sizeof(R::A)
感兴趣。