Является ли переопределенная чисто виртуальная функция виртуальной?

#c #overriding #virtual #pure-virtual

Вопрос:

Ниже вы увидите 3 класса. Мой вопрос в том, почему я могу использовать override getArea() FunnySquare класс, даже если он не помечен как виртуальный в Square классе.

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

 class Shape {
  public:
  virtual float getArea() = 0;
};

class Square : public Shape {
  private:
  float length;

  public:
  Square(float len){
    length = len;
  }
  float getArea() override {
    return length * length; 
  }

  void sayHi() {cout << "hell0" << endl;}
};

class FunnySquare : public Square {
  public:
  FunnySquare(float len) : Square(len) {}
  void tellJoke() {std::cout << "I gave you the wrong area haha" << endl;} 
  
  float getArea() override {
    return 2.0;
  }
};
 

Ответ №1:

Да, и Square::getArea то и FunnySquare::getArea virtual другое тоже.

(выделено мной)

Тогда эта функция в производном классе также является виртуальной (независимо от того, используется ли ключевое слово virtual в ее объявлении) и переопределяет Base::vf (независимо от того, используется ли в ее объявлении слово override).

Комментарии:

1. Который, кстати. это одна из многих вещей, которые я НЕНАВИЖУ в C . Ничто в исходном коде никогда не должно быть «неявным». Если функция «виртуальная», язык должен требовать , чтобы вы говорили «виртуальная». Если переменная является «объектом», вы всегда должны указывать «()» при создании экземпляра. И не заставляйте меня начинать с того, как C 11 перехватил ключевое слово «auto»…