Узнайте размер полиморфного объекта - PullRequest
7 голосов
/ 14 ноября 2011

У меня есть указатель Base* base_ptr на полиморфный объект. Можно ли узнать размер динамического типа указанного объекта?

AFAIK, sizeof(*base_ptr) дает размер статического типа base_ptr. Я начинаю подозревать, что это невозможно, но, может быть, я что-то упускаю.

Примечание: я знаю, что могу добавить виртуальную функцию в мою иерархию типов, которая возвращает размер, но в моем случае это нежелательное решение.

РЕДАКТИРОВАТЬ: sizeof(base_ptr) -> sizeof(*base_ptr)

Ответы [ 3 ]

12 голосов
/ 14 ноября 2011

Нет, вы не можете сделать это в C ++ - по крайней мере, портативным способом.Лучше всего было бы иметь getSize() функцию-член, реализованную в каждом классе.

6 голосов
/ 14 ноября 2011

Да. Вы можете реализовать виртуальную функцию в базовом классе, которая возвращает размер:

class Base
{
   virtual int size() { return sizeof(Base); }
};
class Derived : public Base
{
   virtual int size() { return sizeof(Derived); }
};

//......
Base* b = new Derived;
int size = b->size(); //will call Derived::size() and return correct size
2 голосов
/ 06 февраля 2013

Вы можете использовать CRTP идиома , если это возможно, как я описал здесь: https://stackoverflow.com/a/14730166/908336

...