Вызов метода производного класса из общей ссылки на базовый класс

0

У меня есть базовый класс

class base {
  public:
    base();
    int someData;
    virtual void foo(){
      std::cout << someData;
    }
};

и несколько производных классов, таких как

class derived : public base {
  public:
    derived();
    void foo(){
     std::cout << someData * 5;
  }
};

В основном они имеют один и тот же тип данных, но операции с этими данными различны. У меня есть еще один класс, который не нуждается в подробностях моего объекта, все, что ему нужно сделать, это установить данные и вызвать производные foo().

class useData {
  public:
    useData();

    base x;
    int do() { x.someData = 5; return x.foo(); }
};

Я хочу, чтобы "useData" был как можно более общим, поэтому я использую базовый класс вместо производного класса в его определении. Конечно, в этом случае он будет вызывать базовый метод, а не производный. Как я могу переписать свой код или сделать его автоматически (без проверки типа или аналогичного) вызвать производный метод?

спасибо

Теги:
polymorphism
oop

1 ответ

1

Для использования полиморфизма вам нужен указатель или ссылки. Поэтому в useData переменная x должна быть объявлена как base *. После этого вы можете создать new с любым производным классом. Полиморфизм будет действовать, как ожидалось.

  • 0
    Я знаю, что должен использовать указатель (извините, код, который я написал, был очень простой заглушкой), но, возможно, я что-то упускаю. Если я делаю «new производный ()», это означает, что я знаю, какой тип производного класса использовать, поэтому мой класс useData не является универсальным и должен иметь знания о каждом виде производного класса. Это именно то, чего я пытаюсь избежать.
  • 2
    Вы, кажется, неправильно понимаете полиморфизм. Обычно вам нужно знать, какой тип объекта вы создаете (есть исключения). Если у вас есть указатель на экземпляр объекта, то не имеет значения, какой у него производный класс, если вы хотите выполнять базовые операции.
Показать ещё 1 комментарий

Ещё вопросы

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