Я получаю строку из токенов двух типов:
float и
char.
Нужно, считывая их последовательно, все поместить в массив, чтобы реализовать полиморфное поведение. Значит нужно выделить абстрактный класс и создать массив указателей на него, в который мы будем помещать адреса объектов классов-наследников.
Окей.
Пример кода:
class Token // выделяем абстрактный класс
{
public:
virtual float getFloat() = 0;
virtual char getChar() = 0;
}
class FloatToken : public Token
{
private:
float floatVal;
public:
FloatToken() : floatVal(0.f) {}
float getFloat() override {
return floatVal;
}
char getChar() override { // вынужденная реализация-заглушка
return 0;
}
}
class CharToken : public Token
{
private:
char charVal;
public:
CharToken() : charVal(0) {}
char getChar() override {
return charVal;
}
float getFloat() override { // вынужденная реализация-заглушка
return 0.f;
}
}
Создается абстрактный класс, в котором содержится поведение для обоих классов-наследников, чтобы реализовать полиморфное поведение, но это одновременно создает необходимость писать определние всех функций абстрактного класса в каждом наследнике. Т.е делать некие заглушки, которые никогда не должны использоваться.
Пока что единственное решение, которое пришло в голову, это поместить эти заглушки в private-секцию. Но чувство костыля не покидает.
Как правильно организовать код в таком случае?
UPD: пример учебный, к реальным задачам не имеет отношения. Из учебника Лафоре, глава 11, задача 8.
Там создается стек из чисел и операций. Операции - это char, а числа - float.