C++ 具有虚拟析构函数的派生类的Sizeof

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(){} }; 公众: 静态常数

在求职面试中,我被这个问题弄得不知所措:

bool Res-它向我们展示了什么

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/<代码>是否有任何<代码>虚拟< /代码>函数,尽管C++标准中没有这样的保证:

  • 如果
    T
    确实具有
    virtual
    功能,
    a
    不会向表示添加任何内容,并且可以与
    T
    大小相同
  • 如果
    T
    没有
    virtual
    函数,
    a
    可能会添加一些东西来处理动态调度(通常是指向类似
    virtual
    函数指针表的指针),并且具有不同的大小
< > C++标准没有强制执行动态调度,并且实现可以从地址中确定对象具有什么类型。实际上,所有实现都使用指向动态类型信息的指针


一个有趣的问题是编译器是否能检测到
R::a
不能用于继承,因此,决定它实际上不需要
虚拟
函数指针。我敢肯定,编译器可以这样做,从而使
R::Res
的值变得更加可疑。

尝试向
T
sizeof(R)
添加一个虚拟函数并不有趣。R::A的大小是多少?这是一个有趣的问题,但在求职面试中没有这个位置。一些软件开发公司真的疯了。这在一定程度上取决于如何评估答案。这里的示例:您可以提到,使用vtable实现虚拟功能的标准并不能保证这一点。虽然在实践中,这没有关系。@DanielJour你当然是对的,谢谢。我不会更改它,因为它已经在公认的答案中得到了更好的解释。@starllight:为什么您会对
R
的大小感兴趣?您对值
R::Res
sizeof(R::A)
感兴趣。