sizeof(*this)和struct继承

Tim*_*per 6 c++ inheritance struct sizeof

说我有struct类似以下内容:

struct ParentStruct
{
   virtual void XYZ()
   {
      getSize(sizeof(*this));
   }
   int memberX;
}
Run Code Online (Sandbox Code Playgroud)

另一个struct继承父结构:

struct ChildStruct : public ParentStruct
{
    int memberY;
    int memberZ;
}
Run Code Online (Sandbox Code Playgroud)

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

我宁愿不必覆盖XYZ()所有的子结构,因为我会有很多子结构.

Xeo*_*Xeo 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;
};
Run Code Online (Sandbox Code Playgroud)

这应该给出想要的效果.


Kar*_*nek 3

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

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

struct ChildStruct : public ParentStruct<ChildStruct>
{
    int memberY;
    int memberZ;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 但是你不能制作像向量这样的通用东西,如果没有类型参数,`vector&lt;ParentStruct&gt;`将无法工作。继承中的许多美好事物都因此而丧失。 (3认同)
  • @Dani:只需像我的示例一样添加一个超级基,一切都很好。 (3认同)