sizeof (* this) и наследование структуры - PullRequest
6 голосов
/ 27 октября 2011

Скажем, у меня есть 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() во всех подструктурах, поскольку у меня их будет много.

Ответы [ 5 ]

7 голосов
/ 27 октября 2011

Как говорят другие, тип 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;
};

Это должно дать желаемый эффект.

3 голосов
/ 27 октября 2011

Вы можете использовать шаблоны, чтобы обойти эту проблему:

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

struct ChildStruct : public ParentStruct<ChildStruct>
{
    int memberY;
    int memberZ;
}

Таким образом, вы сообщаете родительской структуре, кто ее дочерние элементы - это не супер чистое решение, но оно выполняет работу и избегает повторениякод getSize.

1 голос
/ 27 октября 2011

Тип типа this всегда является статическим типом класса, поэтому sizeof(*this) всегда sizeof(ParentStruct).(Подумайте: как бы sizeof оставалось постоянным выражением, если бы тип this не был статичным?)

Если вы сообщите нам, что вы пытаетесь сделать, мы можем предложить более приемлемые альтернативы.1008 *

0 голосов
/ 27 октября 2011

Я считаю, что sizeof в этом случае знает только размер статического типа из *this (т.е. ParentStruct), но не его тип во время выполнения (ChildStruct). Неважно, что XYZ() здесь объявлено virtual.

0 голосов
/ 27 октября 2011

вы получаете размер базовой структуры, которую вы не перегружали в дочернем

...