Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 133
1

Полиморфизм в C++: практическое использование переопределния виртуальных функций

09.05.2019, 16:11. Просмотров 312. Ответов 5
Метки нет (Все метки)


Доброго всем времени суток.
Решил разобраться с полиморфизмом в C++.
Но в процессе изучения натолкнулся на такую дилемму. Не понимаю значения служебного слова override.
Точнее понимаю, что оно должно сопровождать функцию класса-потомка, которая была виртуальной в базовом классе, для её переопределения. Если его не написать, то произойдет сокрытие метода. Но... а почему бы и нет? Цель была, я так понимаю - получить разную реализацию под одним и тем же именем. Сокрытие это вполне себе позволило сделать.
Вот создал такой учебный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
class Human
{
private:
    std::string name;
public:
    Human(std::string inName) { name = inName; }
    std::string getName() { return name; }
    virtual void work()  
    {
        std::cout << "And it gives mony for him or her!!!" << std::endl;
    }
};
 
class Programmer : public Human
{
public:
    Programmer(std::string name) : Human(name) {}
    void work() override
    {
        std::string text = this->getName() + " is writing code";
        std::cout << text.c_str() << std::endl;
        Human::work();
    }
};
 
class Medic : public Human
{
public:
    Medic(std::string name) :Human(name) {};
    void work()
    {
        std::string text = this->getName() + " is treating people";
        std::cout << text.c_str() << std::endl;
        Human::work();
    }
};
 
class BOB : public Programmer
{
public:
    BOB() : Programmer("Bob") 
    {
        std::cout << "Bob was born" << std::endl;
    }
};
 
 
class MARY : public Medic
{
public:
    MARY() : Medic("Mary")
    {
        std::cout << "Mary was born" << std::endl;
    }
};
 
int main()
{
    MARY *Mary = new MARY();
    std::cout << std::endl;
    BOB *Bob = new BOB();
        std::cout << std::endl;
    Mary->work();
    std::cout << std::endl;
    Bob->work();
    std::cout << std::endl;
    system("pause");
    return 0;
}
В классе Programmer метод work() переопределен по правилам. В классе Medic присутствует сокрытие метода. Но в итоге мы все равно имеем разный функционал для метода work() в разных классах наследниках. И доступ к реализации метода work() базового класса мы получаем внутри метда work() производного класса успешно.
Каков тогда смысл использования override? В каких ситуациях его отсутствие станет критичным?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2019, 16:11
Ответы с готовыми решениями:

Практическое применение виртуальных функций
Собственно препод задал вопрос, рассказал ему все про механическую сторону вопроса, мол что такое,...

Полиморфизм и исследование виртуальных функций
Добавьте в состав класса виртуальную функцию просмотра текущего объекта print (), а в производный...

Использование виртуальных функций
Программа берет данные из двух файлов, в которых есть дата и количество проданных билетов, и...

Использование виртуальных функций
Дан класс &quot;треугольник&quot;, который определяется длиной одной из сторон и значениями прилегающих...

5
557 / 434 / 21
Регистрация: 16.12.2010
Сообщений: 953
09.05.2019, 16:15 2
override - это слово для компилятора, с помощью которого можно точно определить, что идет перегрузка виртуального метода, а не добавление нового, тем самым программист обезопасит себя, если изменит/удалит виртуальный метод в базовом классе.
2
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 133
09.05.2019, 16:26  [ТС] 3
Цитата Сообщение от Ciberst Посмотреть сообщение
программист обезопасит себя
Вот в этом моменте я и не догоняю пока. Обезопасит от чего?
Ведь, что я сделаю сокрытие, что переопределение, в производном классе я получаю другой функционал, не зависящий от функционала, что был определен для базового класса.
0
14014 / 7502 / 1774
Регистрация: 30.01.2014
Сообщений: 12,558
09.05.2019, 16:39 4
Pb-BASS, Польза от ключевого слова override

Добавлено через 2 минуты
Pb-BASS, возможно вам еще стоит почитать эту статью.
2
868 / 327 / 75
Регистрация: 17.05.2015
Сообщений: 1,000
09.05.2019, 16:42 5
Цитата Сообщение от Pb-BASS Посмотреть сообщение
Обезопасит от чего?
Это гарантирует, что виртуальный метод наследника переопределяет метод базового класса.

Что бы не получилось так: в базовом классе виртуальный метод изменили,
а в наследниках не поправили.

Например, в большом проекте, если вы измените метод базового класса,
то компилятор сразу покажет всех наследников,
где тоже нужно подправить сигнатуру методов.
2
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
09.05.2019, 16:45 6
Цитата Сообщение от Pb-BASS Посмотреть сообщение
Вот в этом моменте я и не догоняю пока. Обезопасит от чего?
Если вы не напишете override, но всё сделаете правильно, то всё равно произойдёт переопределение виртуального метода. То есть, перекрытия не случится. Но компилятор видит ваше намерение переопределения виртуального метода.
Ciberst говорит о том, что когда переопределён виртуальный метод и его прообраз удалён в предке, то синтаксически код верен и компилятор не станет вас беспокоить о том, что метод потерял родительский прообраз (мой кривой термин). Даже если вы в потомке укажете virtual он решит, что это начало цепи виртуальных методов.
Есть ещё кое-что. Если вы напишете в потомке метод с именем таким-же как у виртуального в предке, но по сигнатуре будут отличия (мех. ошибка или намудрите с аргументами по умолчанию), то вы не получите переопределения виртуального метода, хотя будете так думать. Но если, слово override присутствует, компилятор вам скажет, что так не бывает и вы спасены.
Ошибка, которая может возникнуть - логическая ошибка и может долго мучить на ровном месте.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2019, 16:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Использование свойства полиморфизма и исследование механизма виртуальных функций
Создайте класс Matr, определите в нем виртуальную функцию-член matrica(int n), которая определяет...

Свойства Qt. Практическое использование
Вот что у меня получилось: #include &lt;QtGui&gt; #include &lt;QApplication&gt; #include &lt;QLabel&gt;...

Практическое использование ООП
Хоть по этому вопросу и есть множество информации и тем даже на этом форуме, но понимания...

RSACryptoServiceProvider практическое использование
Заинтересовался классом RSACryptoServiceProvider Но имеются три вопроса: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.