说我有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()
,因为我会有很多子结构。
答案 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)
你得到的是你没有在孩子身上重载的基本结构的大小