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

Sta*_*ght 2 c++

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

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

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

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

Die*_*ühl 6

Res应该表明是否T有任何virtual功能,尽管在C++标准中没有这样的保证:

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

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

一个有趣的问题是编译器是否可以检测到R<T>::A;不能用于继承的编译器,因此决定它实际上并不需要virtual函数指针.我很确定编译器可以做到这一点,使得价值R<T>::Res更值得怀疑.