C ++ Полиморфизм: нужно ли объявлять виртуальную функцию в производном классе постоянной, если ее объявленная константа в базовом классе - PullRequest
0 голосов
/ 04 июля 2018

У меня есть два класса. В базовом классе A виртуальная функция window(void) объявлена ​​константой const, а в производном классе B window(void) не объявлена ​​как cont. Удовлетворяет ли это полиморфизм? Если я вызову window() в main, сначала он вызовет производный класс B window(), а затем версию класса A window(). В моем случае это не так. Должен ли я поставить константу в конце функции в производной тоже?

  class A 
  {
   public:
      virtual int window (void) const
      {
         std::cout<<" We are in class A "<<std::endl;
         return std::min(x,y); // x is smaller
      }
    private:
    int x, y;              
   }

  class B : public A 
  {
   public:
       virtual int window (void)
       { 
          std::cout<<" We are in class B "<<std::endl;
          return A::window ();
       }
   }

   void main()
   {
     int z = window();
     std::cout<<z<<std::endl;
   }

Вывод должен быть таким

 We are in class B
 We are in class A
 x

1 Ответ

0 голосов
/ 04 июля 2018

Сигнатура переопределяющего метода должна точно соответствовать сигнатуре виртуального базового метода, который он переопределяет (хорошо, за исключением случая ковариантных возвращаемых значений, но это не относится к вашему вопросу). Эта подпись включает в себя конечный const ness. Так что да, если базовый метод объявлен как const, переопределяющий метод также должен быть объявлен как const.

Если вы используете C ++ 11 или новее, вы должны пометить переопределяющий метод с помощью спецификатора override , тогда компилятор проверит, что он фактически переопределяет виртуальный базовый метод * 1009. * совпадающая подпись , и генерирует ошибку, если не найден соответствующий базовый метод. Вы не получите эту проверку во время компиляции, если опустите спецификатор override.

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