具有虚析构函数的派生类的sizeof

时间:2015-09-20 08:39:00

标签: c++

在求职面试中,我对这个问题感到不知所措:

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

template <class T>
class R
{
        class A: public T {
                virtual ~A(){}
        };
public:
        static const bool Res = sizeof(A) == sizeof(T);
};

在我调查期间 - 我一直有sizeof(T)== 1,而sizeof(A)变化。非常感谢解释。

1 个答案:

答案 0 :(得分:6)

Res的值应指明T是否具有virtual函数,尽管C ++标准中没有此类保证:

  • 如果T确实有virtual函数,则A不会向代表添加任何内容, 的大小与{{{1}相同1}}。
  • 如果T没有T函数,virtual 可能会添加一些内容来处理动态调度(通常是指向{{}的指针{1}}函数指针表)并且具有不同的大小。

C ++标准并没有强制要求如何实现动态调度,并且实现可以能够从地址确定对象具有什么类型。实际上,所有实现都使用指向动态类型信息的指针。

一个有趣的问题是编译器是否可以检测到A不能用于继承,从而确定它实际上并不需要virtual函数无论如何指针。我非常确定编译器可以这样做,使R<T>::A;的值更值得怀疑。