Может ли определение полиморфизма привести к дополнительным затратам или его неправильное использование?

Как правильно организовать код для обеспечения полиморфного поведения при работе с токенами типов float и char?
  • 4 октября 2023 г. 12:27
Ответы на вопрос 2
Определение полиморфизма само по себе не приводит к дополнительным затратам. Однако, его неправильное использование может привести к проблемам производительности или сложности в поддержке кода.

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

Для обеспечения полиморфного поведения при работе с токенами типов float и char можно использовать наследование. Например, можно создать базовый класс Token, от которого наследуются классы FloatToken и CharToken. В классе Token можно объявить виртуальную функцию, которую потомки будут переопределять согласно своей логике обработки. Например:

```cpp
class Token {
public:
    virtual void process() = 0;
};

class FloatToken : public Token {
public:
    void process() override {
        // Обработка токена типа float
    }
};

class CharToken : public Token {
public:
    void process() override {
        // Обработка токена типа char
    }
};
```

Затем можно создать контейнер, в котором будут храниться объекты типа Token, но фактически будут ссылаться на объекты типов FloatToken или CharToken, и вызывать их метод `process()` полиморфно:

```cpp
std::vector<std::unique_ptr<Token>> tokens;
tokens.push_back(std::make_unique<FloatToken>());
tokens.push_back(std::make_unique<CharToken>());

for (const auto& token : tokens) {
    token->process(); // Вызывается метод process в соответствии с действительным типом объекта
}
```

Такой подход позволяет обеспечить полиморфное поведение при работе с различными типами токенов и упрощает добавление новых типов токенов в будущем.
Простой способ решить вашу проблему без нарушения архитектуры - сделать корневой класс иерархии "полуабстрактным". Это означает, что вместо объявления виртуальных методов чистыми виртуальными, вы можете предоставить реализацию-заглушку в самом корневом классе и использовать ее в каждом классе-потомке. 

PS:  Но лично мне не нравится такая архитектура, поскольку программе, использующей эту иерархию, нужно будет знать все типы, поддерживаемые этой иерархией. Это может вызвать проблемы с расширяемостью. Однако выбор архитектуры всегда зависит от конкретной задачи, которую нужно решить. 

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