Виртуальное наследование c++. Ромбовидное наследование c++. Изучение С++ для начинающих. Урок
HTML-код
- Опубликовано: 13 окт 2024
- Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)
Множественное наследование c++ пример. ООП. Изучение С++ с нуля для начинающих. Урок #109
goo.gl/N3fHEE
Наследование в ООП пример. Что такое наследование. Для чего нужно наследование классов. ООП. C++ #98
goo.gl/yFNiim
Поддержка канала
/ simplecode
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit
Я ещё не дошёл до этого урока. Сейчас изучаю массивы,но не зайти поставить лайк хорошиму преподавателю это грех
Спасибо, ценю! =)
Ну как? Дошел?
Я дошла и планирую залайкать на этом канале всё что можно)
@Данил Лафин он мог не заметить/вспомнить это сообщение
Нет, не дошёл. Подзабил на с++.,давно уже веб изучаю. С++ оказался мне не особо нужен, но я по нему и книг много прочитал, так что опыт пригождается. Иногда пишу проги для микроконтроллеров на языке Си. Не вижу смысла изучать что то если нет конкретной задачи и цели
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
Спасибо! Но очень хотелось бы видеть это на реальных примерах, то есть какую то программку создать полезную. А то пока я не очень понимаю, для чего мы все это делаем, унаследуем что-то и т.п.)
почему в одном примере КОНСТРУКТОР 2 класса наследника через двоеточие дополняется КОНСТРУКТОРОМ 1 наследуемого класса, а во втором примере достаточно добавить только в название наследуемый класс???
#виртуальноенаследование #ромбовидноенаследование #SimpleCode #урокипрограммирования
Спасибо! На таких примерах заходит еще лучше!
Ля, шо то просмотров мало, надо репостить видос! Спс за урок!
Я просто Худею от этих уроков
Какие они классные!!!
♥♥♥ Господи, спасибо за Ваш труд и подробные уроки! ♥♥♥
Сказал родителям что умею вызывать предков
чё ответили?
ответ убил
@@aspidinton в психушку отправили
@@danielluko7635 жалко
Родители вызвали метод Process kill
Спасибо за очередной урок.
Спасибо Сергей за Шикарно изложенный материал!
Инцест в мире классов 😂
Очень интересная тема. Спасибо!!!
Спасибо за урок.
Хорошая подача, интересно послушать о шаблонах, синголтонах и рефлексии в таком же стиле. Урок супер!
спасибо за урок
Очень интересно! Очень доходчиво, примеры мне нравятся! Спасибо большое! Но если бы я создавал игру, класс "воин" не содержал бы в себе характеристику "НР", ведь не может быть "воин" без рассы (как будто пустой доспех), он бы содержал, например, методы атак ближнего боя или ношения доспехов. А класс "орк" содержал бы в себе физические характеристики данной рассы, в том числе "НР". И при получении наследованием конечного класса, его методы и характеристики не двоились бы.)
Т.к. он приводил пример с игрой фентези, он использовал класс Caracter (в котором имелись хп) для того чтобы реализовать ещё какую нибудь расу например эльфы, люди. Просто это удобнее не нужно каждой рассе отдельно писать хп. Может ты думаешь это переменная мелочь, а если бы там была логика с отниманием хп, регенерацией и т.д. Лучше написать несколько раз virtual, вместо того чтобы копипастись эту ерунду :D.
Спасибо за понятный урок! лайк!
Spasibo bolshoe.
Спасибо, все хорошо。
Супер! Шикарное объяснение с очень наглядными примерами. Премного балгодарен.
Очень пригодилось , спасибо за отличные и понятные уроки!
vidos ogon' avtor krasavec
Сергей, спасибо!
Спасибо!!!!!
Спасибо
Спасибо большое за данный урок друг!!!
сергей, а будут уроки как работать с xml файлами?
up
большое спасибо за уроки, вы просто ЛУЧШИЙ!!! с меня Lamborghini (как стану богатым ).
ну как, подаришь ламбу или нет ?
А сейчас? Мне просто интересно как жизнь сложилась. Если спился, можешь не отвечать.
хороший урок и интересные примеры, спасибо)
Ппц, комментов мало. А видео крутые и доступные.
А почему это происходит вообще? Как ключевое слово virtual влияет на наши классы, что они в итоге создают только один базовый класс?
Видимо, компилятор просто понимает, что один раз надо унаследовать, но мне тоже интересно на самом деле.
если компилятор видит, что класс наследуется от классов, у которых есть виртуальное наследование от одного и того же класса, то он вызывает для такого класса конструктор предка предка всего один раз.
Хороший вопрос
При виртуальном наследовании классы-наследники наследуют не весь базовый класс, а какой-то конкретный его объект, поэтому и свойства совпадают
Может кто-то в будущем читать будет, так что максимально как могу объясню. Когда вы используете виртуальное наследование, это обеспечивает, что даже если класс наследуется несколькими путями, будет только один экземпляр виртуального базового класса, который используется всеми этими путями(orcwarrior тоже считается, хотя он не наследует виртуально, но мы комбинируем его с множественным наследованием, и конечный класс (в данном случае orcwarrior) тоже виртуально наследует базовый класс). И вот при создании объекта производного класса, который использует виртуальное наследование, компилятор выделяет память для одного экземпляра виртуального базового класса. Еще можно дополнить, что когда orc и warrior обращаются к character, они используют указатель на character, чтобы получить доступ к его членам. Этот указатель указывает на один и тот же экземпляр character, независимо от того, от какого класса character наследуется.
#SimpleCode
ты крутой
Здравствуйте Сергей! У меня возник такой вопрос: Может ли при таком наследовании базовый класс быть одновременно Абстрактным и Виртуальным?
наличие чего либо виртуального и делает класс абстрактным. ибо в нем ничего нельзя реализовывать.
@@revue6218 чисто виртуального*
Если ещё актуально: Абстрактные классы могут хранить в себе не меньше одной реализации виртуального метода, при этом можно описывать тело в других методах(в этом классе). Интерфейс может содержать ТОЛЬКО реализацию виртуальных методов, больше ничего:)
Спасибо большое за урок
у меня вопрос не по теме ролика, но очень хотелось бы узнать будут ли видео по созданию приложений на с++ с помощью конструктора форм? помню в vs2013 была возможность делать такие приложения, но в vs2017 я такого не нашел :(
Спасибо за урок! Можно ли вместо виртуального наследования использовать ключевое слово static в поле с XP? Получается данное поле будет одно на все объекты? Т.е вопрос, как наследуются статические поля и методы?
Спасибо!)
Зачем? Тогда при создании ещё одного орка или воина или "ворк-оина" у всех у них будет ОДНО изменяемое поле HP. Ранили любой экземпляр любого не базового класса - ранили всех созданных персонажей по цепочке.
@@VeganaMaia-Nemo вот-вот
Нельзя
Спасибо за урок)
static HP?
Dėkui
Уровень и стиль начинающих зависит от уровня наставника. Но здесь почти все идеально рассказано о плюсах. Мелочи можно простить т. к. у многих других преподносят почти халтуру за 2-3 десятка "левых" уроков.
В примере с персонажем, вы не передаете _HP_ а делаете для простоты конструкторами по умолчанию.
Но вот вопрос, я попробовал передать _HP_ в конструктор _OrcWarrior_
Компилятор заругался _Для Character не существует конструктора по умолчанию_
Помогла запись для конструктора: *OrcWarrior(int HP) : Warrior(HP), Orc(HP), Character(HP)*
Судя по отладчику все норм, заходит только в класс _Character_ а в остальных выводит строку.
Или он мне не показал просто как скачет по конструкторам передавая HP из потомка в родителя и вплоть до деда.
*Результат положительный* , *Является ли эта запись правильной?* _(Или есть подводные камни при более сложной реализаций)_
Добавил конструктор по умолчанию.
Хотел бы спросить про методы для такого случая. Если у каждого класса будет одинаковый метод с разной реализацией, то компилятор кричит о неоднозначности. Я видел видео на похожую тему у вас, но тут дело в ромбовидном наследовании. Нельзя прописать метод для OrkWarrior, если такой же метод есть у обоих наследников. Как это решить?
Всё понятно, но самый главный вопрос: как инициализировать поле int hp при создании объекта?
В конструкторе.
OrcMage() : hp(100) {}
а разве в первом варианте не будет возникать ошибка при обращении к companyName в объекте GraphicCard, так как переменная будет двусмысленной?
Будет, если не уточнять, из какого родительского класса "достать" companyName.
Нужно самому конкретизировать:
graphic card("AMD", "Samsung");
cout
Было бы решением данной проблемы передача через конструктор в классы Orc и Warrior класса Character по ссылке?
Смысл в наследовании, ты конечно можешь передавать вообще что тебе заблагорассудится в методы, но тут именно смысл в том что Орк-Войн наследует свойства война и орка, при этом являясь персожем.
Это возможная реализация, но с точки зрения расходования памяти и процессорного времени нецелесообразно. Потому что при передаче по ссылке поля объекта Character придётся копировать во вновь генерируемый объект класса Orc или Warrior и выделять под него память.
А в первом случае как сделать, чтобы информация не задваивалась? Virtual там не работает, требует конструктор по умолчанию.
Можете, подсказать, пожалуйста! Я сделала virtual наследование для первого примера с графической картой. Выдалась ошибка "для класса Component отстуствует конструктор по умолчанию", ну я сделала конструктор по умолчанию, в результате при запуске программы не вызывается вообще конструктор Component . Что делать?
я додала в конструктор компонент вивід рядка
Компилятор намекает, что тебя ждут на кухне.
Если кому-то будет актуально, надо передавать значения 2х stringов (условно GraphicCard GTX1070("Palit","Samsung"); ). В этом то и суть этого метода. Надеюсь автор вопроса уже сама все понимает за это время)
а если захотим задать определенный ХП как задать ?
как передать данные
Здравствуйте! Можно ли использовать виртуальное наследование не для ромбовидного? И второй вопрос: можно ли наследоваться таким же образом от больше, чем двух родителей?
_____A____
_/_/__\_\
B_C__D_E
_\_\__/_/
_____F____
На первый вопрос, я не имею представления где еще можно использовать виртуальное наследование, и помоему это так, ведь в самом начале ролика сказали что "это ромбовидное или как его еще называют виртуальное...". А второй вопрос, если судить по логике то должно быть можно.
@@dufget Это вы даете. Виртуальное наследование не = интерфейсу. К тому же зачем вы сюда приплетаете интерфейс, если смысл вопроса данного человека был другой. Он спросил - "Можно ли использовать виртуальное наследование не для ромбовидного?". Но ромбовидное и виртуальное наследование это одно и тоже, просто иногда говорят "ромбовидное наследование", а иногда "виртуальное наследование". - вот так я ответил.
А как теперь установить HP для Орка, Война и ОркоВойна? Я имею ввиду через конструктор. Больше интересует ОркоВоин. Точно также как с компьютерным железом, только надо добавить пустые конструкторы по умолчанию? Или это излишне и проще сетер использовать?
Немного опоздал, но можно сеттер использовать и через конструктор
наследие ромбом понятно. меня выбило из колеи начало: GPU и Memory часть класа GraphicCard. Вот какая беда: мы 2 раза вызываес конструктор Component, который по идее просто перезапишет фирму производитель. Как я понимаю: GraphicCard должен наследоваться от Component, и получит свое поле производителя, потом членами своего класа должен создать екземпляры GPU и Memory, в которых будут свои фирмы-производители. Либо я чтото не понял...
gc.Memory::companyName
Это норм синтаксис?
так себе
А как доступиться до переменной HP, если не применять виртуальное наследование?
спасибо за урок!
нужно написать либо Orc::HP или Warrior::HP
Нужно самому конкретизировать. Например, в случае с базовым классом Component:
graphic card("AMD", "Samsung");
cout
Привет, не с кем посоветоваться, можешь пожалуйста ответить на один важный вопрос для меня? Заранее благодарен. Учусь на 2 курсе тех.вуза, хочу летом пройти стажировку, знание базовых сортировок( вставкой, пузырьком, перестановкой, слиянием), базовых алгоритмов, есть шанс что меня примут? Но непосредственного опыта программирования в какой-то области нету, пусть тот же Qt или с базами данных тоже не работал
Не знаю примут или нет, но пробовать всегда стоит, если не попытаться - точно не примут.
спасибо за ответ
Знание алгоритмов сортировок вообще не нужно в реальной работе. А вот понимание структур данных крайне важно (списки, словари, коллекции, наборы и т.д.)
@@deniskozak5997 , как у вас успехи спустя 4 года?
взяли?
Спасибо за урок ! Вот обидно ... Видео по програмированю набирает 3к просмоторов, а какойто фунтик боле милона -_-
Բագրատ Գալստյան Фунтика ставят родители для детей чтоб не мешали делать свои дела, далеко не все родители в этот момент смотрят уроки по программированию 🤷🏿♂️
Так я что-то не понял, на лунтика наезжаешь? За лунтика и двор стреляю в упор. Чтобы такого больше я не слышал. А по чесноку, это реально дети смотрят, а детей по априоре должно быть больше. Дети этого не поймут ибо много букавак и непонятных слов.
К тому же это С++, и вы не рассмотрели другие языки, ведь на других языках могут быть намного больше программистов и просмотров
Блин, из видео снова сюда заглянул, чтобы убедиться, действительно ли это очередной, 114 урок, а не перепрыгнул штук 10 нечаянно...
А если у базовых классов будут методы с одинаковым именем и разной реализацией, то какая из них попадёт в генерируемый объект?
Конечно странный вопрос, во первых, как мы можем иметь 2 базовых класса, а во вторых, если мы хотим вызвать метод конкретного класса наследника, то мы конкретно должны написать: ::class::method().
Конечно странный ответ. Наследник может спокойно иметь более чем 1 базовый класс, как например классы подмешивания.
Вот ты говоришь легко получить информацию кода компонент вызвался дважды и сохранил в своих экземплярах соответствующие названия, так как вывести эту информацию? я понимаю, что она хранится в этих экземплярах но как к ним обратиться, уже голову всю сломал(
Через поле видимости конкретного класса. Где-то здесь был пример ::ClassName::FieldName
Орк..... Как же часто это слово мы сейчас используем
Графиккарты, чипы, память - я электронщик, моя тема, и тут епт... орки пошли...
А можно родительский класс объявить виртуальным?
Уважаемый Сергей, спасибо за видео. Не понятно только, зачем ты перешёл с компьютера на игру?
Как то тема не раскрыта, ну написали virtual А HP конкретно то от куда браться будут из орка или из воина??? Вот я вообще ни чего не понял
Да, интересно если будут в конструкторах инициализироваться поля hp в базовых классах, то с каким в итоге значением останется объект генерируемого класса. По идее с тем, что в последнем конструкторе
Пытался переписать, что-то не работает.
#include
#include
#include
#include
#include
using namespace std;
class compon {
public:
compon(string compname) {
cout
Пересмотри конструктор класса "graphic", там ты ошибся в передачи параметра. Тоесть нужно не cpucompname, а gpucompname
прррррррррррограммирование
А в каких языках еще реализовано виртуальное наследование?
Из Википедии: "В список языков, поддерживающих множественное наследование, входят: Io, Eiffel, C++, Dylan, Python, некоторые реализации классов JavaScript (например, dojo.declare), Perl, Curl, Common Lisp (благодаря CLOS), OCaml, Tcl (благодаря Incremental Tcl), а также Object REXX (за счёт использования классов-примесей)."
Может кто знает, как обратиться в каждое поле имени компании из финального класса?
Можно через указатели на базовые классы. Вот так:
((GPU*)&card)->company; // Cи-стиль
а лучше так:
static_cast(&card)->company; // C++ стиль
Выглядит, конечно, не очень. Так что я бы убрал поле company в прайват и сделал из этих двух выражений два паблик метода в GraphicCard.
const string& GraphicCard::GetMemoryCompanyName() { return static_cast(this)->company; }
const string& GraphicCard::GetGPUCompanyName() { return static_cast(this)->company; }
Может есть и другой способ, не знаю. Но даже если и есть, в любом случае получается как-то странно и неудобно. Лично мне пока ни разу не попадались ситуации, где реально бы пригодилось такое наследование (интерфейсы не в счёт!). Здесь по моему, (как и во многих подобных ситуациях) даже с точки зрения моделирования правильнее сделать композицию. Класс GraphicCard должен просто включать в себя объекты Memory и GPU. С чего бы ему их наследовать? Это всё равно что сказать, что человек наследует свой мозг. А наследование GraphicCard я бы сделал разве что от Component, поскольку нам могла бы пригодится возможность обращаться с ней, как с отдельным компонентом, имеющим своего отдельного производителя, например MSI, и т.д.
Так то урок хороший. Пишу это не для того чтобы докопаться до примера)) а просто самому хотелось бы понять, зачем всё таки такое в реальности нужно. Много где видел подобные примеры, и всегда они выглядят как-то надуманно, либо я просто чего-то не понимаю.
@@НикитаГончаров-ы4ц так,.. идите,.. идите отсюда! Кто вас сюда впустил, здесь начинающие!
@@md.403 разобрался?)
Есть мнение, что виртуальное наследование как и дружественные методы - костыли при плохом дизайне.
@@dufget Переопределение виртуальных методов в наследнике и виртуальное наследование вещи совершенно разные ) Внимательно посмотрите урок.
Спросите меня через год, добился я чего-либо в АйТи.
Ну как дела?!! ...или еще рано?
Добился? Ну прошло 7 месяцев, но результат уже должен быть. Просто врятли кто нибудь спросит это еще через пять месяцев.
@@ДмитрийКошелев-п5э Всё пошло не по плану, так что теперь сижу в вебе и потихоньку изучаю JS. весь плейлист просмотрел но сменил направление
@@Quazaru Что это так? Что случилось что сменил направление?
@@ДмитрийКошелев-п5э Ну во-первых, плюсы тогда я изучал на отьебись, так что и практики мало было. Заданий по плюсам меньше и найти где попрактиковаться сложнее, самоучкой так же стать в разы сложнее, так что выбрал веб
и орк это персонаж... поймут Украинцы.. эх
спасибо
up
спасибо