Вызов переопределенных методов, если базовый метод не является виртуальным - PullRequest
0 голосов
/ 18 января 2019

Как правило, переопределение виртуального метода позволяет использовать переопределенный метод следующим образом:

class base
{
  public:
  virtual void start() {std::cout << "base start" << std::endl;}
  virtual void stop() {std::cout << "base stop" << std::endl;}
  void doSomething() { start(); stop(); }
};

class derived : public base
{
  public:
   void start() {std::cout << "derived start" << std::endl;}
   void stop() {std::cout << "derived stop" << std::endl;}
};

int main () {
    derived d;
    d.doSomething();
    return 0;
}

Вывод этого фрагмента кода:

derived start
derived stop

Мой вопрос: как мне добиться того же поведения, если функции start() и stop() не были виртуальными в базовом классе?

Дополнительная информация:

То, что я хочу, вероятно, нарушает полиморфные понятия. Тем не менее, мне очень любопытно посмотреть, есть ли решение, даже хакерское.

1 Ответ

0 голосов
/ 04 февраля 2019

Если все, что вам нужно, - это иметь возможность вызывать те методы, которые вы отметили virtual в базовом классе, через функцию с именем "doSomething" (или каким-либо другим вашим действительным приложением), таким образом, что выпродемонстрировал.Затем вы также можете переопределить «doSomething» в производном классе, скопировав его определение из базового класса следующим образом:

#include <iostream>

class base
{
public:
  void start() {std::cout << "base start" << std::endl;}
  void stop() {std::cout << "base stop" << std::endl;}
  void doSomething() { start(); stop(); }
};

class derived : public base
{
public:
  void start() {std::cout << "derived start" << std::endl;}
  void stop() {std::cout << "derived stop" << std::endl;}
  void doSomething() { start(); stop(); }
};

int main () {
    derived d;
    d.doSomething();
    return 0;
}

Однако я уверен, что вы понимаете, что дублирование такого метода в производном классезапахи.Так что лучше этого не делать.

Если вы намеревались использовать позднее связывание где-то еще в вашем коде, то у вас возникнут проблемы, если вы будете избегать использования virtual .Например, изменив значение «main» на следующее:

int main () {
    base* d = true ? new derived : new base;
    d->doSomething();
    return 0;
}

Всегда будет вызывать методы базового класса без virtual .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...