![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Account |
![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Есть вот такая программа.
По меню по очереди можно вывести бабочку, потом шестиугольник правильный, потом комбинированно бабочку в шестиугольнике. Бабочки и шестиугольник наследники от общего класса фигуры, а вот комбо от бабочки и шестиугольника. Не пойму вот следующее по идее класс Combo должен ведь унаследовать методы Move и SetNewColor, так как он наследник от Butterfly и Hex, которые в свою очередь наследуют данный метод от Figure. Но если выкинуть эти методы как сделано в выше представленном коде и напрямую обращаться например F3.SetNewColor(color);F3.Move(10*direction,10*direction); естественно компилятор материться. Так как правильно оформить наследственность и добраться до данных методов, не прописывая их в классе Combo и естественно не описывая так void Combo::Move(int x) P.S. Как в спойлер код скрывать, а то как то не красиво длинный пост получается? |
![]() ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата но компилятор ругается в конструкторе 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 |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 5:36 |