| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Множественное наследование, виртуальные классы |
| Автор: zim22 11.4.2009, 10:03 |
| Читаю книгу, в конце главы вопрос: "Существует один случай, когда производный класс не должен предоставлять инициализирующих значений для своих виртуальных базовых классов. Что это за случай?" на англ.: "There is one case in which a derived class need not supply initializers for its virtual base class(es). What is this case?" Я думаю правильный ответ "Это случай с абстрактным базовым классом" Но мало ли. Мне интересно узнать правду |
| Автор: zim22 11.4.2009, 10:20 |
всмысле этот тот случай, когда используется конструктор по умолчанию? |
| Автор: Anikmar 11.4.2009, 10:36 | ||||
Само собой, если у базового класса нет конструктора - то и передавать ему ничего нельзя - он же явно не вызывается. В смысле когда у конструктора базового класса нет параметров - ему нечего передавать. Вызывается базовый конструктор без параметров. Если, конечно, я правильно вопрос понял:
Не должен - если их нет. Если они нужны - должен. Положено мясо - ешь, не положено не ешь... |
| Автор: Fazil6 11.4.2009, 16:58 | ||||||
не думаю, что речь идет о этом.не зря ведь в вопросе сказано
Вообще с виртуальными базовыми классами ситуация сложнее чем с обычным наследованием. Не знаю в каком контексте и какой именно случай имел в виду автор но, при использовании виртуального базового класса и необходимости вызова его конструктора с параметрами, этот инициализирующий конструктор должен вызываться самым последним классом в иерархии. Т.е. что-то типа того
вобщем как вариант ответа если этот класс имеет наследника(ов) |
| Автор: zim22 11.4.2009, 17:07 | ||
он может вызываться и всеми предпоследними классами в иерархии. только компилятор будет игнорировать все вызовы, за исключением последнего класса в иерархии вирт.наследования инициализировать базовый виртуальный класс можно не только в наследуемом от него классе, но и в любом другом. Только в этом случае компилятор будет игнорировать инициализацию конструктора базового вирт.класса в списке инициализации. |
| Автор: Fazil6 11.4.2009, 17:07 | ||||
| поэтому существует такая рекомендация: неиметь данных в базовых виртуальных классах, т.е. использовать их как интерфейсы А еще одна рекомендация, которая как правило идет под номером 1, избегать ситуаций когда нужно использовать виртуальное наследование Но это уже какждый решает для себя сам. Добавлено через 45 секунд
может, но не обязан Добавлено через 12 минут и 48 секунд
я не знаю откуда ты вырываешь эти цитаты, или ты сам формулируешь, но эта мысль также не совсем точна. Дело в том, что инициализировать базовый виртуальный класс (как у тебя сказано) действительно можно не только в наследуемом от него классе, но и в любом другом, но если это последний класс в иерархии, то инициализировать базовый виртуальный класс он обязан, т.е. там он должен быть полюбому, а если это не последний , то вовсе необязательно |
| Автор: zim22 11.4.2009, 17:33 | ||
Читаю книжку, а потом как понимаю, так и формулирую. Согласен, что неразбериху говорю. |