sizeof(*this) and struct inheritance

sizeof(*this) and struct inheritance

本文关键字:and struct inheritance this sizeof      更新时间:2023-10-16

假设我有一个struct,如下所示:

struct ParentStruct
{
   virtual void XYZ()
   {
      getSize(sizeof(*this));
   }
   int memberX;
}

和另一个继承父结构的struct:

struct ChildStruct : public ParentStruct
{
    int memberY;
    int memberZ;
}

假设sizeof(int) == 4,当从子结构体调用时,是否有可能将12的值传递给函数getSize()(我目前获得4的值)?

我不希望在所有子结构中重写XYZ(),因为我将有许多子结构。

正如其他人所说,this的类型是它所使用的类的静态类型。不过,你可以使用一些模板技巧:

struct Parent{
    virtual void xyz(){ getSize(sizeof(Parent)); }
    int mem1;
};
template<class D>
struct Intermediate : public Parent{
    virtual void xyz(){ getSize(sizeof(D)); }
};
struct Child : public Intermediate<Child>{
    int mem2, mem3;
};

您可以使用模板来解决这个问题:

template <typename Child>
struct ParentStruct
{
   virtual void XYZ()
   {
      getSize(sizeof(Child));
   }
   int memberX;
}
struct ChildStruct : public ParentStruct<ChildStruct>
{
    int memberY;
    int memberZ;
}

这种方法告诉父结构体它的子结构是谁——这不是一个超级干净的解决方案,但它完成了工作,避免了重复getSize代码。

this的类型类型始终为静态类类型,因此sizeof(*this)始终为sizeof(ParentStruct)。(考虑一下:如果this的类型不是静态的,sizeof如何保持常量表达式?)

如果你告诉我们你想做什么,我们可以建议更可维护的替代方案。

我相信sizeof在这种情况下只知道*this(即ParentStruct)的静态类型的大小,而不是其运行时的类型(ChildStruct)。此处将XYZ()声明为virtual并不重要。

你得到的是基结构体的大小你没有在子结构体中重载它