#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»…