Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Разница между override и virtual [дубликат]

На данный вопрос уже ответили: virtual и override 4 ответа Многие примеры на сайтах показывают использование virtual в объявлении класса, но в дочерних нет никакого override. На msdn.microsoft.com же наоборот пихают virtual также и дочернему классу, + override.
Хотелось бы узнать, вот если я вызываю из базового класса метод
void Base::Method() {
},
Который не переопределяется, а в этом методе используются методы, которые переопределены в дочерних классах - они будут переопределены автоматически или только в случае (Son *) (ptr)->Method2()? И как будет выглядеть ситуация в обоих случаях если virtual void Base::Method2() = 0;?

Вопрос из ответа участника @ Artem


Ответ

virtual указывает, что дочерний класс может переопределить метод. Это совсем не означает, что в дочернем классе будет override. Он может быть.
На msdn.microsoft.com же наоборот пихают virtual также и дочернему классу, + override
К дочернем классам добавляют virtual к методу, чтобы указать, что его потомки так же могут переопределить метод.
Про вторую часть вопроса:
class Base{
void Method() { bar(); } virtual void bar(); { }
};
class A : public Base {
virtual void bar() { }
};
class B : public A {
virtual void bar() { // do something }
};
Сделав так:
A* myObject = new B(); myObject->Method();
Вызовется метод из класса B
Собственно, возвращаясь к virtual. Я мог в классах A и B не объявлять методы как virtual, всё равно сработает метод из B
Точно так же, независимо от того, напишу я так virtual void bar() в B классе или так virtual void bar() override, тоже ничего не изменится. Что с override, что без него метод дочернего класса перекроет метод базового. Просто написав override мы явно это указываем. Очень полезно, если вы с кодом работаете не один.

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

Отправить комментарий