c ++ Использование подклассов

0

У меня есть эта переменная; Мебель ** мебель; Это абстрактный базовый класс для 2 подклассов, книжный шкаф и кушетка. Я добавляю их случайным образом;

furnitures[n++] = new Bookcase ();
furnitures[n++] = new Couch();
.
.

Ради объяснения. Позволяет установить некоторые незначительные переменные. Мебель частная: имя, приз Шкаф частного типа: размер Диван частный: места

Как бы я пошел, если бы хотел распечатать информацию, такую как; имя и места?

В этом вопросе есть множество проблем. 1, укажите, какой подкласс есть, когда я пользуюсь мебелью [i]. 2, я не хочу смешивать слишком много ненужных функций между двумя подклассами, которые необходимы arent.

  • 0
    Я надеюсь, что furnitures инициализирована, так что индексирование четко определено. В любом случае, вам лучше использовать std::vector<std::unique_ptr<Furniture>> .
Теги:
subclass

2 ответа

2
class Furniture 
{
    virtual void output() = 0;
};

class Couch : public Furniture
{
    void output() override;
};

class Bookshelf : public Furniture
{
    void output() override;
};

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

void Furniture::output()
{
    // We assume here the output is to cout, but you could also pass the necessary
    // stream in as argument to output() for example.
    cout << name << price;
}

void Couch::output()
{
    Furniture::output();
    cout << seats;
}

void Bookshelf::output()
{
    Furniture::output();
    cout << size;
}
0

Вы никогда не должны использовать массивы полиморфно. Прочитайте первый пункт (я думаю, это первый) в книге Скотта Мейерса "Эффективная C++, чтобы узнать, почему!

На самом деле, вы почти никогда не должны использовать необработанные массивы в C++. Правильное решение - использовать std::vector<Furniture*>.

Как бы я пошел, если бы хотел распечатать информацию, такую как; имя и места?

В этом вопросе есть множество проблем. 1, укажите, какой подкласс есть, когда я пользуюсь мебелью [i]. 2, я не хочу смешивать слишком много ненужных функций между двумя подклассами, которые необходимы arent.

Вы столкнулись с этой проблемой, потому что вы злоупотребляете объектно-ориентированным программированием. Это просто: объектно-ориентированное программирование имеет смысл, когда разные типы реализуют абстрактную общую операцию, а конкретный тип выбирается во время выполнения. В вашем случае нет обычной операции. Печать (или получение) номеров мест для одного типа, печать (или получение) размера для другого типа.

Это не сказать, что это плохо или неправильно, но это просто не объектно-ориентированное.

Теперь C++ не будет C++, если он не предложит вам опасный инструмент, чтобы выбраться из каждого тупика, в который вы закодировали себя. В этом случае вы можете использовать идентификатор типа времени выполнения (RTTI), чтобы узнать конкретный тип объекта. Google для typeid и dynamic_cast и вы быстро найдете решение. Но помните, что использование RTTI для этой проблемы является обходным решением. Просмотрите дизайн своего класса и при необходимости измените его.

  • 0
    Не могли бы вы обобщить, почему никогда не использовать массив указателей на полиморфные объекты для тех, у кого нет книги?
  • 0
    Я только что прочитал элемент, на который вы ссылаетесь, пункт 3 - «Никогда не обрабатывайте массивы полиморфно» , и он не относится к коду OP. Этот пункт относится к проблемам, которые могут возникнуть, если вы попытаетесь сделать что-то вроде этого: void foo(Base array[]){// Do something with array elements}; foo(Derived array[10]; - в этом случае foo не будет работать должным образом, так как компилятор будет ожидать, что он будет работать с элементами базового размера, но вы передали объекты производного размера (которые, вероятно, больше). OP хранение указателей базовых / производных классов в массиве (в отличие от объектов), поэтому он не столкнется с этой проблемой.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню