1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
| Account |
4.07.2011 18:10
Сообщение
#1
|
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Есть вот такая программа.
По меню по очереди можно вывести бабочку, потом шестиугольник правильный, потом комбинированно бабочку в шестиугольнике. Бабочки и шестиугольник наследники от общего класса фигуры, а вот комбо от бабочки и шестиугольника. Не пойму вот следующее по идее класс Combo должен ведь унаследовать методы Move и SetNewColor, так как он наследник от Butterfly и Hex, которые в свою очередь наследуют данный метод от Figure. Но если выкинуть эти методы как сделано в выше представленном коде и напрямую обращаться например F3.SetNewColor(color);F3.Move(10*direction,10*direction); естественно компилятор материться. Так как правильно оформить наследственность и добраться до данных методов, не прописывая их в классе Combo и естественно не описывая так void Combo::Move(int x) P.S. Как в спойлер код скрывать, а то как то не красиво длинный пост получается? |
![]() ![]() |
| IUnknown |
5.07.2011 17:00
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата но компилятор ругается в конструкторе Combo на то что не найден конструктор для инициализации базового класса Figure Сначала - как это происходит при наследовании обычном: class base {
, то есть, тебе было достаточно в списке инициализации написать только инициализацию тех классов, от которых ты наследовался, а уже они сами будут вызывать конструктор СВОИХ предков... Более того, тебе было запрещено писать в списке инициализации C() конструктор base, потому что ты от него напрямую не наследовался... В случае с виртуальным базовым классом такой вариант не проходит. Класс C должен содержать одну копию base, поэтому надо инициализировать виртуальный базовый класс в наиболее удаленном от него потомке (чтоб потом не спрашивать себя, а откуда же был инициализирован базовый класс, из A или из B?). У тебя наиболее удаленный - не Hexe и не Butterfly, а Combo. Компилятор при виртуальном наследовании ждет инициализации не только Hexe + Butterfly, но и инициализации Figure. Если ты не записываешь его конструктор в список инициализации - будет вызван дефолтный конструктор (без параметров). У тебя и его нет, компилятор старый, не создает конструкторов самостоятельно. Надо добавить инициализацию ручками (все равно ты и в Hehe и в Butterfly одинаково вызываешь конструктор Figure): class Combo : public Hexe, public Butterfly , теперь компилятор знает, чем инициализировать базовый класс, и проблем не будет... Сообщение отредактировано: IUnknown - 5.07.2011 18:03 |
Account Классы, наследственность 4.07.2011 18:10
IUnknown А теперь еще раз: что выкинуть? Где компилятор мат... 4.07.2011 18:35
Account IUnknown, описание класса Combo
class Combo:publi... 4.07.2011 19:03
IUnknown Преподаватель в своем уме? При множественном насле... 4.07.2011 19:33
Account
Преподаватель в своем уме?
.....
Чувствуешь разни... 4.07.2011 19:42
sheka т.е. на всякий случай лучше всегда делать виртуаль... 4.07.2011 19:51
IUnknown На всякий случай надо знать об этом подводном каме... 4.07.2011 20:03
Account Кстати, столкнулся еще с проблемой такой, что оста... 4.07.2011 20:53
IUnknown Вот кстати, без виртуального наследования следы од... 4.07.2011 21:29
Account IUnknown, добавил виртуальное наследование к бабоч... 5.07.2011 16:33
Account Очередной раз спасибо за разъяснение. Учусь на зао... 5.07.2011 17:59![]() ![]() |
|
Текстовая версия | 8.12.2025 16:35 |