给定一个指向对象的超类指针,如何获取对象的大小?

Posted

技术标签:

【中文标题】给定一个指向对象的超类指针,如何获取对象的大小?【英文标题】:given a superclass pointer to an object, how to get the object's size? 【发布时间】:2019-12-30 02:01:08 【问题描述】:

假设我有一个类 Foo,以及它的子类 Bar1、Bar2 和 Bar3。子类可能会添加额外的字段。

实际上,我想要一个适用于 Foo* 的 sizeof(),无论它是基类的对象还是任何子类的对象。

显然我可以创建自己的SizeOf() 方法,并要求所有子类(添加字段)覆盖它以返回更新的SizeOf()。但这并不漂亮,它需要工作,如果您忘记覆盖该方法,或者覆盖但意外错误sizeof(),它可能会导致令人困惑的错误。 (例如,实现 Bar2::Sizeof() return sizeof( Foo ); )。有没有更好的方法?

我希望在这个项目中使用 C++17,但有兴趣讨论任何 C++ 版本。

【问题讨论】:

sizeof() 是编译时,您已经动态(运行时)创建了对象,所以没有。 非常感谢理查德,但我没有说过我必须、想要甚至认为我可以使用 sizeof(),但在虚拟方法中除外。 你想对类型擦除的sizeof() 做什么?也许有一种更优雅的方式来解决更大的问题 【参考方案1】:

据我所知,如果给定基指针的对象的动态类型,则没有直接的方法来获取大小。

您可以创建一个从std::type_index 到大小的关联映射,并使用typeid 从基指针获取std::type_index。剩下的工作是确保将每个派生类型添加到映射中。

最小化每个类的工作量的一种方法是创建一个类模板,该类模板具有一个静态成员和一个构造函数,该构造函数将参数类型添加到映射中。这样,程序员在创建新的派生类型以支持此功能时必须记住的就是使用新类型作为模板参数来实例化该模板。

【讨论】:

我不喜欢地图,但喜欢模板。我不喜欢这张地图,因为我已经有一个指向该事物的指针,并且应该能够仅通过一个或两个指针 deref 来获取有关它的信息,而不是哈希表或 RB 树的开销或您拥有的东西。但我认为模板可以设置一个静态 int 成员,而子类不需要记住这样做并且没有类型,对吧?在这种情况下 p->iMySize 或类似的会起作用。

以上是关于给定一个指向对象的超类指针,如何获取对象的大小?的主要内容,如果未能解决你的问题,请参考以下文章

Java多态如何调用子类对象的超类方法

如何从别处调用 Objective-C 对象的超类的方法?

c ++返回子类,其中函数返回指向超类的指针

如何处理指向通用接口的指针的 JPA 注释

指向对象和继承对象的指针数组

使用返回超类对象的超类方法 - Java