Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 518

Есть ли механизмы наследования в C++ как в Delphi?

02.02.2016, 17:53. Показов 3926. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Я Delphi'ст. И интересует следующий вопрос. А именно в чём различие методов классов abstract от virual в плане наследования?
Приведу пример на delphi:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  TBaseClass = class
   public
     procedure BlaBla(); virtual;
  end;
 
  TNextClas = class (TBaseClass) // наследование от базового класса
    public
     // procedure BlaBla(); virtual; // наследуется от базового (копия) и может перекрыт при наследовании
  end;
 
  TNextClas2 = class (TNextClas) // наследование класса
    public
     // procedure BlaBla(); virtual; // та же петрушка) но от TNextClas
  end;
В данном случае, при наследовании классов метод BlaBla основного класса (TBaseClass) будет унаследован другими классами (предками), без явного их описания, т.е. скопирован. При этом если описать метод BlaBla() следующем образом (является медленным):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  TBaseClass = class
   public
     procedure BlaBla(); dynamic;
  end;
 
  TNextClas = class (TBaseClass) // наследование от базового класса
    public
     // procedure BlaBla(); dynamic; // ссылается на базовый класс, и не копируется
  end;
 
  TNextClas2 = class (TNextClas) // наследование класса
    public
     // procedure BlaBla(); dynamic; // та же петрушка) Ссылается на метод BlaBla() класса TBaseClass
  end;
Т.е. во втором случае BlaBla() метод не копируется классами предками, а только ссылается на метод базового класса.
В общем как обстаят дела у с++ при наследовании классов?
Заранее благодарю...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2016, 17:53
Ответы с готовыми решениями:

Как правильно использовать механизмы наследования и полиморфизма для создания единого интерфейса
Доброго времени суток Комрады! Я невкурю тему про полиморфную обработку или как кошерно_правильно и рассово_верно использовать механизмы...

Разработать и реализовать иерархию классов, используя механизмы наследования
Добрый день, помогите, пожалуйста! очень нужна помощь! Необходимо разработать и реализовать иерархию классов для описанных объектов...

Какие есть механизмы идентификации, аутентификации и авторизации?
Здравствуйте! Ни кто не знает материала про систему идентификации, аутентификации и авторизации в Linux? Как работает, каков механизм,...

82
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 16:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от avgoor Посмотреть сообщение
Вот, допустим, Петя получил наследство от дедушки. Если у Пети нет прав (водительских), значит ли это, что он не унаследовал машину?
Мы сейчас говорим о доступности, а не о наследовании. Про наследование мы всё решили, а вот доступа как нет, так и не было.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2016, 16:46
Цитата Сообщение от castaway Посмотреть сообщение
а вот доступа как нет, так и не было.
Это да. Но к реализации, а не к имени.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
03.02.2016, 16:55
Цитата Сообщение от avgoor Посмотреть сообщение
Но к реализации, а не к имени.
Разве это что-то меняет?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2016, 16:59
castaway, В данном контексте - это философский вопрос. А как известно: 2 философа - 3 мнения.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 19:03
Цитата Сообщение от avgoor Посмотреть сообщение
Если у Пети нет прав (водительских), значит ли это, что он не унаследовал машину?
Если Петя настоящий разбойникхацкер он её и без прав и разобьёт и починит. С него станется. У класса может быть много чего к чему у него нет доступа. И это не значит, что у него этого нет. Разделение прав у наследника и дедушки более изощрённые. И тут есть где поспорить.
Я только не понял почему Петя унаследовал от дедушки? Что же он с папкой то рОдным сделал?!
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2016, 23:26
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что же он с папкой то рОдным сделал?!
То есть дедушку вам не жалко?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 23:28
Цитата Сообщение от avgoor Посмотреть сообщение
То есть дедушку вам не жалко?
А дедушка тоже не сам? Как страшно жить...
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.02.2016, 23:34
Цитата Сообщение от IGPIGP Посмотреть сообщение
У класса может быть много чего к чему у него нет доступа. И это не значит, что у него этого нет.
Полностью согласен пример про машину к этому и был. Доступ и наследование - разные вещи.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.02.2016, 23:54
Цитата Сообщение от avgoor Посмотреть сообщение
машину
Главное чтобы дед был конкретный. Потому как от абстрактного деда, можно и кредит унаследовать. То есть самому реализовывать и машину и много ещё чего...
Это всё святая правда. А вот Дельфи и плюсы тут у нас как-то не сошлись. В вопросе у ТС виртуальный метод может быть перекрыт. В плюсах только реализован или переопределён может быть. Перекрыть можно только не виртуальный метод. Да и то не наглухо, - обойти затенение можно оператором разрешения... Наглухо крышу можно перекрыть зато.
В общем, разные языки, - братья по разуму. Смотрят друг на друга как родные. И ни шиша не понимают. Может в этом великая сермяжная правда?.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.02.2016, 00:53
Цитата Сообщение от IGPIGP Посмотреть сообщение
Перекрыть можно только не виртуальный метод.
Почему это? Сокрыть можно имя и не важно что оно значило в родительском классе, хоть виртуальный метод, хоть переменную-член.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2016, 01:09
Цитата Сообщение от avgoor Посмотреть сообщение
Сокрыть можно имя и не важно что оно значило в родительском классе, хоть виртуальный метод, хоть переменную-член.
Думаете? А я считал что перекрытие, это объявление не просто имени, а метода совпадающего по прототипу, иначе это перегрузка и ничего не перекроется. А попытка "перекрыть" виртуальный метод называется переопределением или реализацией в зависимости от ситуации, но это не просто сокрытие. Хотя доступ к базовому методу через разрешение тоже возможен и при желании можно спорить. Я не видел, просто, что бы в плюсах переопределение называлось перекрытием.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.02.2016, 01:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
иначе это перегрузка и ничего не перекроется
http://ideone.com/ZpRNTO
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2016, 01:55
hoggy, спасибо! Для меня это открытие. Получается что если потребуется перегрузка в дочернем классе, то придётся вызывать базовый уже через оператор :: ?
То есть перекрыть виртуальный метод всё же можно. А зачем?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.02.2016, 01:56
Цитата Сообщение от IGPIGP Посмотреть сообщение
Получается что если потребуется перегрузка в дочернем классе, то придётся вызывать базовый уже через оператор :: ?
http://ideone.com/trAvT9
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2016, 02:06
hoggy, ну using :: это та же песня только аж до конца области. Понятно.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.02.2016, 11:02
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть перекрыть виртуальный метод
Еще раз. Перекрывается имя а не метод. http://ideone.com/XXsL9Y
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2016, 12:09
Цитата Сообщение от avgoor Посмотреть сообщение
Перекрывается имя а не метод.
Спасибо. А бывает что перекрывается метод, а не имя? Перекрывается всегда имя. Перекрывая доступ к ранее объявленной по данному имени переменной, функции... Но говорят и так и так. Экономя слова. Или я снова неточен?
Ваш пример, как раз показывает, что области видимости базового и производного работают так, как будто это одна область, в которой область производного ниже. Я так и думал и это логично. В такой ситуации, существующий в базовом классе метод легко бы перегружался в производном объявлением нового прототипа с данным именем. А происходит затенение.
Кликните здесь для просмотра всего текста
Я с трудом перевариваю факт невозможности неявной перегрузки метода базового класса.
Перерыл то, что имею и не нашёл вразумительного описания данного эффекта. Пока это не сформулировано, мне трудно принять. Как я понимаю это должно быть, где-то: Пространство имён и область видимости класса, подраздел: базовый и первый производный класс. И по тексту как-то вроде: "Перегрузка метода базового класса в производном, требует его дублирования в производном." Понятно, что избежать дублирования кода можно обернув обращение к базовому методу наподобие:
C++
1
2
3
void foo(){A::foo();}
//и далее перегрузка
int foo{...}
Кстати говоря, если пространства у базового и производного классов разные, то можно ли говорить что child IS derived?
Раз говорят значит можно. С указанными ограничениями. Надо переварить.
Ушел читать.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.02.2016, 13:11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но говорят и так и так.
Да, говорят, что перекрыт метод имея ввиду: "Перекрыто имя "..." которое в родительском классе обозначало метод".

Проблема для понимания этого факта вот в чем: Для переменных, когда локальная, например, скрывает глобальную (читай имя глобальной переменной перекрыто), ни у кого не возникает проблем с пониманием этого факта.
А с функциями сложнее, т.к. они могут быть перегружены, и, на первый взгляд, одно имя обозначает несколько разных типов. Но это на первый взгляд. Т.к. есть декорирование имен, и, например, A::Foo() - (public: void __thiscall A::Foo(void)) для линкера VS превращается в "?Foo@A@@QAEXXZ". Т.е. перегруженные функции имеют разное имя. Именно поэтому мы можем сделать так: Parent::Foo(); И пофиг - виртуальный Foo или нет, технически имя Foo в наследнике скрыто, метод Foo просто добавляется в таблицу виртуальных методов и вызывается по адресу, который там записан. Короче: виртуальные и не виртуальные методы просто вызываются по разному, а в остальном - одинаковые.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2016, 13:33
Цитата Сообщение от avgoor Посмотреть сообщение
А с функциями сложнее, т.к. они могут быть перегружены
Не вдаваясь в тонкости различий виртуальных и невиртуальных методов, видно что нет общей области видимости. В глобальной области если есть функция, то добавление нового прототипа - перегрузка. В то время как объявление локальной переменной с именем функции - затенение. В производном классе не так. В его локальной области есть метод базового класса по его имени только пока явно не объявлено это имя. То есть метод есть, а перегрузи, - ан и нету его. Похоже на демонов из к/ф "Иоан Васильевич меняет профессию". Занятно. Чертовски хочется понять, что заставило Страуструпа сделать именно так.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
04.02.2016, 13:46
Цитата Сообщение от IGPIGP Посмотреть сообщение
именем функции - затенение. В производном классе не так.
В производном классе так же. Затенение и сокрытие/перекрытие - синонимы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2016, 13:46

Программирование системы подсказок - есть ли стандартные механизмы?
Требуется сделать систему помощи программы. Есть ли встроенные средства в .NET(c#)? Спасибо за любой совет или подсказку.

Какие механизмы для защиты кучи есть?
Необходимо отключить механизмы защиты от переполнения кучи стоит windows 8.1 vs 12 -13 при необходимости готов менять операционку

Есть ли в Oracle механизмы работы с очень большими объемами данных ?
Проблема такая: Есть база, которой пользуемся уже 4 года, структура базы такова, что есть несколько быстро растущих таблиц связанных с...

Есть исходник DLL на Delphi как (и возможно ли) написать похожее на VB.NET и использовать в среде программы написанной на Delphi
Суть вопроса вкратце такова - Есть исходник DLL написанной на Delphi Library Extdll; uses SysUtils, Windows; type ...

Распределённые системы. Как именно реализовываются механизмы масштабируемости?
Пишу простую распределённую систему. Её задача - связать каждый узел с каждым гарантированно за конечное время в том смысле, что, взяв...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru