С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 12.10.2017
Сообщений: 4

Разное определение (внутреннее) виртуальных функций

12.10.2017, 11:49. Показов 1175. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне вот интересно внутренность виртуальной функции должно повторятся или нет. То есть может одна виртуальная функция содержит один код, а другая другой(как в примере ниже)? А то в гугле одни cout повторяют в виртуальных функциях, а других структур нету.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class t
{
public:
    virtual void top()
    {
        cout << 5;
    }
};
 
class tt : public t
{
public:
    void top()
    {
        if(0) cout << 5;
        else cout << 44;
    }
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2017, 11:49
Ответы с готовыми решениями:

Определение чисто виртуальных функций в потомках
Можно ли вместо определения чисто виртуальной функции в классе-потомке написать эту самую функцию без тела? Т.е. она как бы есть, но ее как...

Посмотреть внутреннее устройство системных функций
Есть ли возможность посмотреть исходный код некоторых встроенных классов. Конкретно интересует public class Uri

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

15
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.10.2017, 11:53
Лучший ответ Сообщение было отмечено Saltor как решение

Решение

Собственно, виртуальные функции для того и нужны, чтобы менять поведение.
1
0 / 0 / 0
Регистрация: 12.10.2017
Сообщений: 4
12.10.2017, 12:06  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Собственно, виртуальные функции для того и нужны, чтобы менять поведение.
Ага вот только толковых примеров(в книгах и интернете нет) ни где не показано. Вот и думай как хочешь.

Добавлено через 8 минут
Не то чтобы я не догадывался переопределить виртуальную функции. Прост они мне мозг запутали этим своим одним интерфейсом. Понятно что имя функции повторяется. А вот код должнен повторятся? В интернете код повторяется только разные переменные подставляют под него, но не меняют его.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.10.2017, 12:50
Не-виртуальные функции используются из того класса, который создан, они не переопределяются. Виртуальные - из того, какой объект реально присвоен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class AbsClass{
public:
  void NonVirt(){printf("AbsClass non virtual\t");}
  virtual void Virt(){printf("AbsClass Virtual\n");}
};
class SomeClass:public AbsClass{
public:
  void NonVirt(){printf("SomeClass non virtual\t");}
  virtual void Virt(){printf("SomeClass virtual\n");}
};
 
int main() {
  AbsClass *c1 = new AbsClass;
  AbsClass *c2 = new SomeClass;
  SomeClass *c3 =new SomeClass;
  c1->NonVirt(); c1->Virt(); //тут все очевидно - все методы принадлежат AbsClass
  c3->NonVirt(); c3->Virt(); //тут тоже очевидно - все методы принадлежат SomeClass
  c2->NonVirt(); c2->Virt(); //а вот тут интересно: Не-виртуальная функция из AbsClass (то есть не переписалась), а виртуальная использована из SomeClass
  delete c3;
  delete c2;
  delete c1;
}

Не по теме:

Что-то мне подсказывает, что мой пример будет воспринят не лучше чем "одни cout повторяют"...


А вообще что мешает поэкспериментировать?
0
12.10.2017, 12:54

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
что мой пример будет воспринят не лучше чем "одни cout повторяют"...
Так это тоже самое, только с printf :D
Кстати, виртуальный деструктор забыли.

0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.10.2017, 13:26
Цитата Сообщение от Croessmah Посмотреть сообщение
Кстати, виртуальный деструктор забыли.
Зачем он тут? Даже переменные ведь не создаются.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.10.2017, 13:31
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем он тут?
Потому что иначе - UB.
Не нужно приучать к такому новичков.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Даже переменные ведь не создаются.
C++
1
2
AbsClass *c2 = new SomeClass;//Создали
delete c2;//Undefined behavior, т.к. динамический тип отличается от статического, и статический тип не имеет виртуального деструктора
In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.10.2017, 13:34
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Зачем он тут? Даже переменные ведь не создаются.
Для правильного полиморфного удаления по указателю.

Добавлено через 1 минуту
Цитата Сообщение от Saltor Посмотреть сообщение
Ага вот только толковых примеров(в книгах и интернете нет) ни где не показано.
Навалом. Например базовый класс фигура с чисто виртуальной функцией подсчёта площади и периметра. И от неё наследуются Трегольник, Круг, Прямоугольник...
1
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.10.2017, 13:51
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что иначе - UB.
В данном случае все-таки нет, потому что структуры одинаковые. Но в общем случае - согласен, надо описывать виртуальные деструкторы.
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
12.10.2017, 13:56
Например, ты учишься в школе. Ты, как и все остальные в школе - люди.
Базовый класс будет человек с чисто виртуальной функцией "getDinner()". Производные от "человека" классы будут "ученики" и "учителя" с перегруженной функцией getDinner(). Ученики получают обычное питание (булочку, сок и пюре недотолченное) , а учителя - королевское (котлекти с хорошей пюрешечкой и салатики).
0
12.10.2017, 14:05

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В данном случае все-таки нет, потому что структуры одинаковые.
Без разницы. Статический и динамический типы не совпадают.
Виртуального деструктора не имеется.
Применение delete в таком случае - UB.

0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
12.10.2017, 14:30
Croessmah, что по-вашему делает деструктор? Освобождает память, занятую переменной. То есть память, занятую переменными и указателем на таблицу виртуальных функций плюс пользовательский деструктор. Размер переменных одинаковый, размер указателя тоже (а что указывает не туда - безразлично).
Где тут UB?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.10.2017, 14:31
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
что по-вашему делает деструктор?
Причем здесь деструктор? Вы читали что я написал и цитату из стандарта?
Цитата Сообщение от Croessmah Посмотреть сообщение
static type shall have a virtual destructor or the behavior is undefined.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.10.2017, 14:36
Croessmah, в общем по стандарту нужно без виртуального деструктора обязательно делать приведение типа:
C++
1
delete static_cast<AbsClass *>(c2);
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.10.2017, 14:47
Цитата Сообщение от TRam_ Посмотреть сообщение
делать приведение типа:
c2 и так AbsClass*.
В данном случае нужно кастовать к SomeClass*.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.10.2017, 15:28
Croessmah, да, именно так. Засмотрелся на
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
AbsClass *c2
и исправил правильное на неправильное...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2017, 15:28
Помогаю со студенческими работами здесь

Перегрузка виртуальных функций
please HELP! перегружаю виртуальную функцию в абстрактном классе. class ONE { virtual std::string FUN(const...

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

Вызов виртуальных функций
Доброго времени суток, форумчане! Стоит такая задача: Есть класс, который содержит три чисто виртуальные функции, назовём его IClass. ...

Механизм виртуальных функций
Всем привет! Имею базовый абстрактный класс: class Interface { public: //функция детектирования устройства true - если команда...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru