sizeof(*this) and struct inheritance
sizeof(*this) and struct inheritance
假设我有一个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
并不重要。
你得到的是基结构体的大小你没有在子结构体中重载它
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- C++Union/Struct位域的实现和可移植性
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- 错误:"Left of getValue must have class/struct/union"
- 在 SVM-Struct 中未定义对 sqrt 的引用(已使用 -lm)
- MPI_DOUBLE_INT and C++ struct
- Delphi and C/C++ DLL Struct vs.Record
- sizeof(*this) and struct inheritance
- The SECURITY_ATTRIBUTES struct and CreateNamedPipe()