Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Виртуальные функции и перегрузка методов, в чем разница?

26.01.2019, 17:57. Показов 9336. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет
к сожалению могу уже уловить мысль, все в куче в голове.
объясните пожалуйста в чем отличие виртуальной функции от перегрузки метода?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2019, 17:57
Ответы с готовыми решениями:

В чем разница построения отчета по разным схемам, физические таблицы и виртуальные
Помогите ответить на вопросы, пожалуйста В чем разница построения отчета по схеме ДОКУМЕНТ – ОТЧЕТ и схеме ДОКУМЕНТ – РЕГИСТР – ОТЧЕТ? ...

В чем разница лямбда-выражений и анонимных методов?
В книге Шидта приводится два способа создания анонимных функций: 1) с использованием ключевого слова "delegate"; 2) с...

В чём разница при использовании разных методов?
1: Часто замечаю что используют пути для поиска по разному, но чем они отличаются ( то есть работают на разные ОС как-то по разному или...

5
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
26.01.2019, 18:31
Наследование - позволяет строить новые определения классов на основе определений существующих классов.
Функции, которые производные классы должны определять самостоятельно, базовый класс определяет как virtual.
Вызовы виртуальной ф-и распознаются во время выполнения.
Вызывается та ф-я, которая соответствует динамическому типу объекта.
Производный класс указывает класс(-ы), который он намеревается унаследовать. Для этого используется список наследования класса, после двоеточия.
Можно запретить переопределение с использования спецификатора final.
Новый стандарт позволяет производному класс явно указать что ф-я-член предназначена для override (переопределения) унаследованной виртуальной ф-и.
Динамическое связывание позволяет взаимозаменяемо использовать тот же код для обработки объектов как типа Родительского, так и Дочернего.
Базовые классы обычно должны определять виртуальный деструктор. Виртуальные деструкторы необходимы, даже если они не делают ничего.
Если производный класс не переопределяет виртуальную ф-ю своего базового класса, то производный класс наследует версию, определенную в его базовом классе.
1
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
26.01.2019, 18:32
Виртуальные методы методы нужны в том случае, когда через указатель базового класса, который указывает на дочерний класс, вызывается некоторый метод. Очень часто, для понимания что же это такое, приводят следующий пример:
допустим у вас есть класс "работник" у него есть виртуальный метод "работать" и обычный "попить чай", у этого класса есть дочерние классы такие как "менеджер", "программист" и "тимлид" (но использовать будем только первый). У этих трех классов так же есть свой переопределенный метод "работать" и "попить чай". Имеем объект "начальник" типа "работник", т.к. от класса "работник", коим и является "начальник", унаследованы остальные три класса то он может хранить в себе ссылку на дочерний класс. Если "начальник" ссылается на объект класса "менеджер" и вызывает метод "работать", то будет вызван метод именно "менеджера", а не "начальника". Однако, если "начальник" все так же ссылается на объект класса "менеджер" и вызывает метод "попить чай", которые, как мы помним, не является виртуальным, то "пить чай" идет начальник, а не объект класса "менеджер".
Вот как это выглядит в коде:
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
#include <iostream>
 
using namespace std;
 
//класс-родитель
class employee
{
public:
    virtual void work() 
    {
        cout << "employee is started to work" << endl;
    }
    void toDrinkATea()
    {
        cout << "employee is drinking tea" << endl;
    }
};
 
//дочерний класс
class manager : public employee
{
public:
    virtual void work()
    {
        cout << "manager is started to work" << endl;
    }
    void toDrinkATea()
    {
        cout << "manager is drinking tea" << endl;
    }
};
 
int main()
{
    //указатель на класс "работник"
    employee *boss;
    //и объект класса "менеджер"
    manager john;
    
    //босс смотрит на нашего менеджера
    boss = &john;
    //и говорит ему работать
    boss->work();
    //хотя сам хочет ничего не делать и пить чай
    boss->toDrinkATea();
 
    //если же менеджер захочет того же,
    //то босс не сможет ему этого приказать
    john.toDrinkATea();
 
    //если же босс захочет поработать
    //то он должен перестать смотреть за другими
    //и начать смотреть на себя (т.е. на класс типа "работник")
    boss = new employee;
    //тогда босс тоже сможет поработать
    boss->work();
 
    return 0;
}
2
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
26.01.2019, 18:37
А перегрузка это, когда например тебе нужно сделать ф-ю, которая в зависимости от надобности могла бы принимать разные параметры, для этого определяют несколько одноименных ф-й - методов, но с разным набором параметров. Тоже самое, что и перегрузка обычных ф-й.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
27.01.2019, 17:48  [ТС]
ребята,можно еще вопрос?
зачем в обобщенных классах делать так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
template<typename data>class foo{
data a;
foo(data x){a=x;}
 
 
 
};
 
 
 
int main(int argc, char*argv[]){
 
foo <int>obj(22);// вот тут я не понял, зачем <int> я же обобщил класс. он должен теперь распознавать любой тип данных, что я хочу присвоить полю его.  зачем указывать этот тип тут? какой смысл тогда в обобщении класса?
return 0;
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.01.2019, 17:57
pcmax, так делают для того что бы явно сказать компилятору какой тип нужно вывести из параметров, дабы исключить стандартные привидения аргументов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <typeinfo>
 
template<typename T>
void Print(T t)
{
    std::cout << typeid(t).name()
        << std::endl;
}
 
int main()
{
    int i = 1;
    double d = 1;
 
    Print(i);
    Print(d);
    Print<double>(i);
    Print<int>(d);
 
    return 1;
}
Добавлено через 1 минуту
Цитата Сообщение от pcmax Посмотреть сообщение
зачем в обобщенных классах делать так?
в твоем примере эта запись <int> избыточна.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.01.2019, 17:57
Помогаю со студенческими работами здесь

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

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

Виртуальные функции, таблицы виртуальных методов, как они работают?
подскажите пожалуйста,где лучше посмотреть про начинку виртуальных функций,т.е. про таблицы виртуальных методов и как они работают. Заранее...

Процедуры и функции. Перегрузка функций (методов) и операторов
Класс  однонаправленный список List. Дополнительно перегрузить следующие операции: &gt;&gt; удалить элемент в заданной позиции + добавить...

В чем разница при объявлении методов Compare(.) и IComparer.Compare(.)
Здравствуйте. У меня вопрос, связанный с реализацией методов сравнения, которые используются далее в методе сортировки. Тривиальный пример...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru