kzhereb / knu-is-ooop2019

Materials for "Fundamentals of OOP" course
MIT License
3 stars 0 forks source link

T10.56. Що таке override? Де його треба ставити? #56

Open yanaskyrda opened 4 years ago

JuliaSamartseva commented 4 years ago

Наприклад, є базовий клас, а у ньому є virtual функція. Нам потрібно переписати цю функцію у деякому класі, що наслідує базовий клас. Тоді, для цього необхідно використовувати override.

class A { 
public: 
    virtual void function() = 0;
}; 
class B : public A { 
public: 
    void function() override  
    { 
      //do something
    } 
}; 
AntonHladkiy commented 4 years ago

Коли перевизначається virtual функція базового класу. class A{ public: virtual void func()=0; }; class B:public A{ public : void func()override { // } };

MarinaMontag commented 4 years ago

Function overriding- це перевизначення функції базового класу у похідному класі з однаковою сигнатурою, тобто типом повернення та параметрами. Але можуть бути ситуації, коли програміст помиляється, перекриваючи цю функцію. Отже, щоб відслідковувати таку помилку, використовують ключове слово override. Override змусить компілятор перевірити базовий клас, щоб побачити, чи існує віртуальна функція з такою самою сигнатурою. А якщо ні, компілятор покаже помилку.

include

using namespace std;

class Base { public: virtual void func()
{ cout << "I am in base" << endl; } };

class derived : public Base { public: // did a silly mistake by putting
// an argument "int a" void func(int a) override
{ cout << "I am in derived class" << endl; } };

int main() { Base b; derived d; cout << "Compiled successfully" << endl; return 0; }

Такий код не скомпілюється оскільки сигнатури у двох функцій різні. Якби не було ключового слова override, такий код не скомпілювався б.

RostyslavMV commented 4 years ago

Коли потрібно перевизначити чи довонити функцію базового класу

class StudentWithRandom : Student { public override double GenerateResult(Competition competition) { double result = base.GenerateResult(competition); result += random.NextDouble() * result; LastResult = result; return result; }

tanyakurdelchuk commented 4 years ago

За допомогою override можна уникнути випадкової поведінки спадкування у коді.

class BaseClass { virtual void funcA(); virtual void funcB() const; virtual void funcC(int = 0); void funcD(); };

class DerivedClass: public BaseClass { virtual void funcA(); virtual void funcB(); virtual void funcC(double = 0.0); };

Цей приклад показує, в якій ситауції без використання override поведінку похідного класу може бути випадковим. Компілятор не видає помилки при використанні цього коду.

i1red commented 4 years ago

override після методу вказує на те, що цей метод є перевизначеним методом базового класу. Цей модифікатор не впливає на рантайм, але якщо, наприклад, у базовому класі не буде такого методу, то програма не скомпілюється. Він потрібен, скоріше, для зручності

ilyakorenevskyi commented 4 years ago

override перевизначає метод базового классу, ставиться після методу

Beam-of-Light commented 4 years ago

Ключове слово override призначене для перевизначення методів при наслідуванні. Ставиться після методу