|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.11.2009, 02:52 | #11 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Ну, раз такое дело, то в принципе можно получить доступ к конкретному методу через явное указание его области видимости, при этом приводить тип нет необходимости, правда не знаю, то ли это, что Вам нужно, так как не в курсе, какой при этом генерируется код
Код:
Кстати, если не секрет, с помощью какого компилятора проводятся тесты? |
15.11.2009, 04:23 | #12 |
Пользователь
Регистрация: 08.11.2009
Сообщений: 16
|
Спасибо...
Блин, я тоже только что нашёл это решение... я опоздал, хотел первым. Как я мог забыть, конечно, я читал про расширение видимости. Как приятно когда сам до чего-то доходишь, даже приятнее чем по подсказке. Компилятор на VC++ 2008. Потом может быть проверю на разных методах компиляции с оптимизации и без и схожесть с VC++ 6.0. Статьи состоят из частей (уже 3 сделаны кое-как будет их около 5), но пока не готовы и требуют тщательной доработки. Очень виню себя за глупые ошибки как например с конструктором копирования, который я перепутал с типов привидения к объекту. Когда все статьи сделаю то создам тему для обсуждения и добровольных указаний-корректировок из-за того что я могу путать понятия в С++ и излагать не правильно какие-то мысли. Пару статей можно посмотреть по ссылкам. Часть 1 Часть 2. У меня опять проблема. Просьба не обращать внимания на не правильные сущности... Виртуальная функция GetInfo не может быть определена.... error C2250: World: неоднозначное наследование "void control::GetInfo(void)" (указатель компилятора становится на ошибке указанной ниже) Код:
Надеюсь в частности на Вашу поддержку, netrino. Функция GetInfo должна работать в своих контекстах. Последний раз редактировалось Stilet; 19.11.2009 в 11:46. |
19.11.2009, 11:44 | #13 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
А для класса World какая именно функция должна выполняться?
Player::GetInfo() или Building::GetInfo() ? Компилятор сам не может это определить. |
19.11.2009, 15:00 | #14 | |
Пользователь
Регистрация: 08.11.2009
Сообщений: 16
|
Цитата:
void move(int dx,int dy, int dz) {x+=dx;y+=dy;x+=dz;GetInfo();} И этот obj->Player::move(5,5,0); //внутри должна вызваться Player::GetInfo() obj->Building::move(6,6,0);//внутри должна вызываться Building::GetInfo() |
|
19.11.2009, 15:43 | #15 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Нужно смотреть на этот момент:
Код:
Код:
|
19.11.2009, 16:02 | #16 | |
Пользователь
Регистрация: 08.11.2009
Сообщений: 16
|
Хорошо GetInfo() должна быть в World, т.е. переопределена в классе World.
И почему-то виртуальные функции срабатывают только в контексте World - как самого последнего производного класса в иерархии. Попробуйте скомпилировать проект и можно это увидеть. Т.е. я так понимаю нельзя с помощью виртуальных функции вызывать не конечный производный класс, а производный класс до конечного. Наверно, надо пользоваться статик кастом Цитата:
Здесь должна вызваться только World::GetInfo() и классы Player и Building тут вообще не причём. Я же Вам написал ключевой момент : void move(int dx,int dy, int dz) {x+=dx;y+=dy;x+=dz;GetInfo();} GetInfo() должна вызваться в котекстах (выделенны жирным) obj->Player::move(5,5,0);{ID=id; Health=health; GetInfo();} obj->Building::move(6,6,0);{ID=id; Health=health; GetInfo();} А вызывается всегда метод конечного производного класса, т.е. World: obj->Player::move(5,5,0);{ID=id; Health=health; World::GetInfo(); А должно быть по идее работы виртуальных функций: obj->Player::move(5,5,0);{ID=id; Health=health; Player::GetInfo(); obj->Building::move(5,5,0);{ID=id; Health=health; Building::GetInfo(); |
|
19.11.2009, 16:11 | #17 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Блин. Используешь виртуальные там, где они наоборот не нужны. Они создавались для такого поведение, которое тебе наоборот не нужно и от которого нужно избавиться. Убери virtual у GetInfo и наслаждаёся "правильной" работой.
Не виртуальная функция выполняется в контексте класса, который ему подсунули. А виртуальная сначала смотрит для объекта какого класса на самом деле она вызывается и в контексте этого класса и вызывается. |
19.11.2009, 16:18 | #18 |
Пользователь
Регистрация: 08.11.2009
Сообщений: 16
|
Похоже я переборщил Перезанимался. Спасибо.
Последний раз редактировалось MasterGH; 19.11.2009 в 16:22. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помощь в классах и функциях. | Serror | Общие вопросы C/C++ | 11 | 10.10.2009 06:23 |
Паскаль ООП. Примеры программ с использованием ООП | SeЯgey | Помощь студентам | 5 | 13.05.2009 21:55 |
Небольшой этический вопросик о классах. | Longedok | Помощь студентам | 2 | 04.08.2008 13:23 |
реализация стратегии на классах | mahsus | Общие вопросы C/C++ | 1 | 28.12.2007 10:27 |