140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
|
||||||||||||||||
1 | ||||||||||||||||
Как обратится к обьекту класса, являющегося наследником абстрактного класса31.07.2015, 23:58. Показов 6949. Ответов 131
Метки нет (Все метки)
Здравствуйте!
У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck). eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия. Вопрос: как через указатель четвертого класса доступится к наследующим классам?
0
|
31.07.2015, 23:58 | |
Ответы с готовыми решениями:
131
как узнать,является данный объект класса А1 наследником класса А2 Как полю класса А обратится к приватной функции класса А? Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса |
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
|
01.08.2015, 03:18 | 41 |
В пределах protected не считаю нарушением, мы даем доступ не кому попало а только тому, кому нужно, и особо не заостряю внимание на правильности, только потому, что кто-то описал что так нельзя делать (на заборе тоже написано)
0
|
01.08.2015, 03:27 | 42 |
Вобщето кому попало, ибо- всем наследникам (если конечно вы не собираетесь их потом "скрывать", все 20 штук в каждом наследники "первого уровня")
... хорошо если их всего один уровень, а если больше? Добавлено через 2 минуты В данном случае нет веских оснований что бы делать через protected.
0
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
|
01.08.2015, 03:36 | 43 |
0
|
01.08.2015, 03:57 | 44 | ||||||||||
А вы как думаете зачем правила?
Ну и с закрытием как вариант с разруливание проблемы
3
|
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
|
|
01.08.2015, 04:59 | 45 |
Добавлено через 27 минут Неужели. Протрезвили. Если я правильно понимаю, при наследовании не-private-члена он создается в экзмепляре в количестве равном количеству наследований + 1 ( base > s1 > s2 - в s2 будет 3 экземпляра свойства X, что прямо противоречит не правилам инкапсуляции, а законам мироздания ). А private-члены создаются в единственном экземпляре в суперклассе. Чего нельзя сказать о методах ( если свойство одно, то методов работы с ним множество ), что обуславливает возможность сохранения их со всех предков и желаемый доступ, либо внутри класса, либо открытый, либо закрыть для следующих наследников ( типа устаревший для современности ). Если так, то с этого надо было начинать, а то: "инкапсуляция, инкапсуляция..."
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
01.08.2015, 05:23 | 46 | |||||
Avazart - прав.
всем остальным - читать Макконелла. если Макконелл не поможет - уже ничто не поможет. зы: Avazart, в отдельных случаях данные члены могут быть открытыми/защищенными. это случаи, когда они логически являются частью интерфейса, а не данными. то есть, они отвечают за управление классом (подобно публичным методам), а не за состояние его экземпляра. пример: допустим, есть кнопка (библиотечный класс), и нужно посетить реакцию на клик: http://rextester.com/GBPX73313
потому что весь дизайн уже задал std::function. и сеттеру тупо нечем было бы заниматься. в принципе.
0
|
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
|
|
01.08.2015, 05:24 | 47 |
Собственно, теперь понял, почему размер классов у меня рос с прогрессией 16 48 104, вместо 16 40 64.
Avazart, спасибо за терпение, обсуждение и примеры.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
01.08.2015, 06:39 | 48 |
Не знаю, здесь мне кажется более феншуйным передавать указатель на функцию как аргумент либо конструктору кнопки, либо функции SimulateClick.
0
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
||||||
01.08.2015, 06:59 | 49 | |||||
Конструктор специально убрали. В объявлении C явно указано public B - а следовательно, переопределяя дефолтный конструктор мы можем явно вызвать только конструктор B. Класс C еще ничего не знает про A, точнее знает поскольку декларация уже произошла, но не знает что это дедушка для него, выясняется это только, когда конструктор B вызвал конструктор A,а C вызвал B. Все тоже самое происходит даже если мы не определяли конструктор, ибо подставится компилятором.В итоге класс C увидит у класса B все, что у него там унаследовано от отца.
Теперь развиваем магию над int v_ в C заносим (только первый вариант кода).
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
01.08.2015, 07:02 | 50 |
Вообще-то проектировать надо начинать с интерфейсных функций, а не с данных. А зачем вам абстрактная заправка понадобилась? Это в задании так или вы сами придумали?
1
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 07:48 | 51 |
лепить громоздкий вариадик-конструктор,
который на самом деле тупо делегирует все std::function? на крайняк конструктор может принимать std::function, а не указатель-на-функцию. это позволит избежать шаблоно-кода, и не придется ограничивать функционал только лишь указатель-на-функцию. ну ок. слепили. и тут проблема: у кнопки может быть до чертиков разных событий: CLICK, DCLICK, PASSED,HOVER,OUT - это лишь джентельменский набор. сюда ещё можно добавить кучу всякой всячины: дрангдроп, селект, масс-селект, юзерские события, тп. и что осталось от вашего феншуя? -------------- по феншую конструктор должен принимать только и только самый минимум настроек, минимально необходимый для сохранения работоспособности. количество самих конструкторов при этом должно быть минимальным: только для поддержания дизайна в рабочем состоянии. но никто в здравом уме не делает кастомизацию в конструкторах.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
01.08.2015, 10:20 | 52 |
Ну вот сразу видно благородного и воспитанного джентльмена! Охотно бы поспорил, но в моем лексиконе просто нет столь же изысканных выражений.
0
|
01.08.2015, 11:17 | 53 |
hoggy, Ну впринципе да всегда могут быть исключения, стоит смотреть по месту, но мне кажется все же стоит думать о том как спрятать - Signals2
Ибо открытым мы делает все же объект, в том время как в нем может быть больше возможностей чем нам хотелось бы показать. Что касается исключения- паттерн property
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 11:28 | 54 |
плохой путь.
именно это я и называю "громоздкой вариадик шаблоно-функцией" и начинается: 1. под методы 2. под свободные функи. 3. под функторы. велосипедирование функционала std::function. нафига? учитывая, что: нечего добавить. нечего убавить. решение уже является законченным дизайном.
0
|
01.08.2015, 11:37 | 55 | |||||
Ну в std::function есть оператор вызова, вполне может оказаться что мы бы не хотели что бы пользователь имел возможность использовать его напряму менуя метод. Кстати как быть с наследованием на примере иерархии A/B/C если открывать std::function?
Добавлено через 5 минут В boost::signals2 куда больше возможностей и не все охота их показывать/допускать.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
01.08.2015, 11:47 | 56 |
ну если так, тогда выбора не остается - придется прятать в приватах.
хотя хз, зачем такое запрещать. это ж батону никак навредить не может. выглядит не очень читабельно, но это уже на совести пользователя. если что нибудь пойдет не так, std::function сам отобьется (бросит исключение, etc).
0
|
01.08.2015, 12:10 | 57 |
Это рост памяти? Ну ну продолжайте экономить на спичках...
Чет не понял зачем там конструктор. Вообще не понял про конструктор. Спасибо кеп, я вообщето и показал что он видит то что ему не нужно видеть что черевато ошибками. Добавлено через 4 минуты Ну это да. Я говорил в общем, да и как бы лигчески правильно скрывать все что не нужно пользователю, что бы исключить к максимуму возможность неправильного использования класса пользователем. Добавлено через 16 минут Ну SimulateClick может и вообще не быть, т.е вызов может происходить при получении сообщения от системы. Конструктор- будет жестко задавать "обработчик" нельзя будет его менять в рантайме. P.S.: std::function кстати подходит не лучшим способом ибо не исключает вероятности что будет ссылаться на удаленный объект, поэтому я и упамянул boost::signals2.
0
|
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
|
|
01.08.2015, 12:25 | 58 |
Не знаю, у меня при наследовании классы росли не соотвествующе увеличению количества переменных - больше.
Это смотря как посмотреть. Наша планета тоже спичка в Галактике, но и в этой спичке море интересного. Грамотный программист найдет оптимальный режим между объемом занимаемой памяти и нагрузкой на процессор (то и не удивительно, что "калькулятор", вдруг оказывается, затребляет по 500 Мб ОЗУ непонятно зачем) В таком случае еще более острым становится вопрос, объявленный в этой теме, поскольку она не только не объединяет данные, а скорее разъединяет их с таким уровнем доступа, что не есть гуд.
0
|
18895 / 9853 / 2410
Регистрация: 30.01.2014
Сообщений: 17,296
|
|
01.08.2015, 14:18 | 60 |
Со всем согласен, кроме этого. Нарушает инкапсуляцию не friend, а программист, который неправильно его использует.
Собственно, об этом Страуструп высказывался довольно четко:
0
|
01.08.2015, 14:18 | |
01.08.2015, 14:18 | |
Помогаю со студенческими работами здесь
60
Метод абстрактного класса не видит переменные дочернего класса Вызов функции класса, который наследуется от абстрактного класса Как инициализировать члены класса, являющегося параметром шаблона Как обратится к объекту класса Как обратиться к конструктору абстрактного класса Как вызвать функцию из абстрактного класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |