Определение размера полиморфного класса C++

Я сказал бы, что это - сильно типы, поскольку каждое выражение имеет тип, который не является функцией, он - значение; e.i. это может быть известно перед временем выполнения.

OTOH я не уверен, что это - корректное описание со строгим контролем типов. Единственная более сильная претензия, которую я вижу причину языка для создания, была бы обеспечением, что Вы не можете ниспровергать систему типов во времени выполнения через, дают иное толкование броскам типа, объединениям, звонящим на другие языки, указатели, ассемблер, и т.д. Языки как это существуют, но так нанесены вред, что они, кажется, не очень интересны для программистов за пределами высокого обеспечения и академии. Как указано кем-то, чтобы действительно сделать то право Вы начинаете должными быть иметь типы как nonZeroInt и этажерка. Фу.

5
задан sbi 15 January 2016 в 07:57
поделиться

3 ответа

Если вы знаете набор возможных типов, вы можете использовать RTTI для определения динамического типа, выполнив dynamic_cast . Если вы этого не сделаете, единственный способ - использовать виртуальную функцию.

6
ответ дан 13 December 2019 в 05:38
поделиться

Или вы можете использовать typeid, который может быть быстрее, чем dynamic_cast (также с dynamic_cast вы можете приводить к промежуточным типам в иерархии).

Это выглядит довольно плохо:

#include <iostream>
#include <typeinfo>

class Creature
{
    char x[4];
public:
    virtual ~Creature() {}
};

class Animal: public Creature { char x[8];};

class Bird: public Creature { char x[16]; };

class Dog: public Animal { char x[32]; };

class Cat: public Animal { char x[64]; };

class Parrot: public Bird { char x[128]; };

unsigned creature_size(const Creature& cr)
{
    if (typeid(cr) == typeid(Animal)) {
        return sizeof (Animal);
    }
    else if (typeid(cr) == typeid(Dog)) {
        return sizeof(Dog);
    }
    else if (typeid(cr) == typeid(Cat)) {
        return sizeof(Cat);
    }
    else if (typeid(cr) == typeid(Bird)) {
        return sizeof(Bird);
    }
    else if (typeid(cr) == typeid(Parrot)) {
        return sizeof(Parrot);
    }
    else if (typeid(cr) == typeid(Creature)){
        return sizeof(Creature);
    }
    assert(false && "creature_size not implemented for this type");
    return 0;
}

int main()
{
    std::cout << creature_size(Creature()) << '\n'
    << creature_size(Animal()) << '\n'
    << creature_size(Bird()) << '\n'
    << creature_size(Dog()) << '\n'
    << creature_size(Cat()) << '\n'
    << creature_size(Parrot()) << '\n' ;
}

Для каждого новый тип, вам нужно будет добавить код в функцию creature_size. С функцией виртуального размера вам также необходимо реализовать эту функцию в каждом классе. Однако эта функция будет значительно проще (идеально копировать-n-вставить, что показывает, что могут быть как ограничения в языке, так и проблемы с дизайном вашего кода):

virtual unsigned size() const { return sizeof(*this); }

И вы можете сделать ее абстрактной в базовом классе, который означает, что это будет ошибкой компилятора, если вы забудете переопределить этот метод.

Изменить: это, естественно, предполагает, что для любого Существа вы хотите знать его размер.

3
ответ дан 13 December 2019 в 05:38
поделиться

Я не могу поверить, что кто-то '

0
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: