sizeof(* this)和struct继承

时间:2011-10-27 00:06:53

标签: c++ inheritance struct sizeof

说我有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()(我当前得到的值为< EM> 4 )?

我不希望在所有子结构中覆盖XYZ(),因为我会有很多子结构。

5 个答案:

答案 0 :(得分:7)

正如其他人所说,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;
};

这应该给出想要的效果。

答案 1 :(得分:3)

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

template <typename Child>
struct ParentStruct
{
   virtual void XYZ()
   {
      getSize(sizeof(Child));
   }
   int memberX;
}

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

通过这种方式,您可以告诉父结构其子项是谁 - 它不是一个超级干净的解决方案,但它可以完成工作并避免重复getSize代码。

答案 2 :(得分:1)

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

如果您告诉我们您要做的事情,我们可以建议更多可维护的替代方案。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

你得到的是你没有在孩子身上重载的基本结构的大小