Доброго времени суток.Просветите пожалуйста.
Насколько я понимаю сабж это при множественном наследовании полезно чтоб данные не слишком пухли. А может для чего нибудь еще? Можно примерчик маленький? А то вот на бранйбенче куча вопросов с сабжем была на тесте — а я честно говоря и забыл что это такое, сдал в результате хреновенько, на три с копейками, ладно, сойдет для первого раза. Надо было вопросы куда нибудь соханять а я от волнительности чрезмерной запямятовал. Щас пытаюсь вспомнить и не получается
Спасибо
Булат
Здравствуйте Юнусов Булат, Вы писали:
ЮБ>Доброго времени суток.Просветите пожалуйста. ЮБ>Насколько я понимаю сабж это при множественном наследовании полезно чтоб данные не слишком пухли. А может для чего нибудь еще? Можно примерчик маленький? А то вот на бранйбенче куча вопросов с сабжем была на тесте — а я честно говоря и забыл что это такое, сдал в результате хреновенько, на три с копейками, ладно, сойдет для первого раза. Надо было вопросы куда нибудь соханять а я от волнительности чрезмерной запямятовал. Щас пытаюсь вспомнить и не получается ЮБ>Спасибо ЮБ>Булат
Если ты имеешь ввиду чисто виртуальные базовые классы, то нужны они чтобы объявить неизменный интерфейс, который в последствии будут реализовывать его потомки. И в последствии, например, вместо возвращения (передачи) указателя на к.-либо класс, возвращают (передают) указатель на этот базовый класс — данные в нем, как правило, не объявляются и это обеспечивает доступ к объекту только через его интерфейс. У Страуструпа про это чуть-чуть написано, в литературе по СОМ рассматривается лучше.
Do not fake yourself ;)
ICQ#: 198114726
Re[2]: virtual base class для чего обычно юзается?
Здравствуйте Dr_Sh0ck, Вы писали:
ЮБ>>Насколько я понимаю сабж это при множественном наследовании полезно чтоб данные не слишком пухли. А может для чего нибудь еще? Можно примерчик маленький? А то вот на бранйбенче куча вопросов с сабжем была на тесте — а я честно говоря и забыл что это такое, сдал в результате хреновенько, на три с копейками, ладно, сойдет для первого раза. Надо было вопросы куда нибудь соханять а я от волнительности чрезмерной запямятовал. Щас пытаюсь вспомнить и не получается
DS>Если ты имеешь ввиду чисто виртуальные базовые классы, то нужны они чтобы объявить неизменный интерфейс, который в последствии будут реализовывать его потомки. И в последствии, например, вместо возвращения (передачи) указателя на к.-либо класс, возвращают (передают) указатель на этот базовый класс — данные в нем, как правило, не объявляются и это обеспечивает доступ к объекту только через его интерфейс. У Страуструпа про это чуть-чуть написано, в литературе по СОМ рассматривается лучше.
Похоже ты спутал "чисто виртуальные базовые классы" с "чисто абстрактными классами".
В принципе Булат сам ответил на свой вопрос: "полезно чтоб данные не слишком пухли". Всё остальное — средства достижения этой цели.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: virtual base class для чего обычно юзается?
Здравствуйте IT, Вы писали:
IT>Похоже ты спутал "чисто виртуальные базовые классы" с "чисто абстрактными классами". IT>В принципе Булат сам ответил на свой вопрос: "полезно чтоб данные не слишком пухли". Всё остальное — средства достижения этой цели.
Виноват-с — бес попутал
Do not fake yourself ;)
ICQ#: 198114726
Re[3]: virtual base class для чего обычно юзается?
Коллеги, прошу простить мое невежество! Просвятите! Чем отличаются "чисто виртуальные" и "абстрактные" классы (про "чисто абстрактные" слышу впервые; "чисто" — наверное жаргон ). Неужели абстрактные — это те, у которых ВСЕ методы чисто витруальные?
Do not fake yourself ;)
ICQ#: 198114726
Re[4]: virtual base class для чего обычно юзается?
Здравствуйте Dr_Sh0ck, Вы писали:
DS>Коллеги, прошу простить мое невежество! Просвятите! Чем отличаются "чисто виртуальные" и "абстрактные" классы (про "чисто абстрактные" слышу впервые; "чисто" — наверное жаргон ). Неужели абстрактные — это те, у которых ВСЕ методы чисто витруальные?
Абстрактные — это у которых ХОТЯ БЫ ОДИН метод не имеет реализации.
class a {
public:
virtual void f() = 0;
};
В этом случае экземпляр такого класса не может быть создан. Но от такого класса можно наследоваться и перекрыть эту функцию. Прекрасным примером применения таких классов являются интерфеёсы COM.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: virtual base class для чего обычно юзается?
Здравствуйте IT, Вы писали:
IT>Здравствуйте Dr_Sh0ck, Вы писали:
DS>>Коллеги, прошу простить мое невежество! Просвятите! Чем отличаются "чисто виртуальные" и "абстрактные" классы (про "чисто абстрактные" слышу впервые; "чисто" — наверное жаргон ). Неужели абстрактные — это те, у которых ВСЕ методы чисто витруальные?
IT> Абстрактные — это у которых ХОТЯ БЫ ОДИН метод не имеет реализации.
IT>
IT>В этом случае экземпляр такого класса не может быть создан. Но от такого класса можно наследоваться и перекрыть эту функцию. Прекрасным примером применения таких классов являются интерфеёсы COM.
Строго говоря, "метод не имеет реализации" и "является чистим виртуальным" — это разные вещи. Никто не запрещает чисто виртуальному методу иметь реализацию:
class a {
public:
virtual void f() = 0
{ ... }
};
Так что правильнее будет сказать, что абстрактным называется класс, у котрого имеется хотя бы один чистый виртуальный метод.
Но это с точки зрения формальной терминологии языка C++. На уровне проектирования абстрактным назвают класс, не предназанченный для самостоятельного инстанциирования (класс, декларирующий интерфейс). Есть ли у него чистые виртуальные методы — неважно.
Best regards,
Андрей Тарасевич
Re[6]: virtual base class для чего обычно юзается?
Спасибо всем, я правда не про абстрактные классы спросил, а про виртуальные
Кстати, насчет абстракнвых кстати на бенче тоже вопрос был:
За точную формалировку не ручаюсь, один из вариантов ответов про них был такой: "их можно юзать as references and pointers"
Ну с поинтерами понятно — в интерфейсном программировании так и делается, а вот использование их как референсов я не видел. И сам не пользовал.
Беда в том еще была что все остальные варианты овета были откровенно бредовые, тако что я поставил галочку здесь.
Потом проверить решил — оказалось правильно поставил
Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?
Re[6]: virtual base class для чего обычно юзается?
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Но это с точки зрения формальной терминологии языка C++. На уровне проектирования абстрактным назвают класс, не предназанченный для самостоятельного инстанциирования (класс, декларирующий интерфейс). Есть ли у него чистые виртуальные методы — неважно.
В MC++ введено специальное ключевое слово для этого — __abstract.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: virtual base class для чего обычно юзается?
Здравствуйте Юнусов Булат, Вы писали:
ЮБ>За точную формалировку не ручаюсь, один из вариантов ответов про них был такой: "их можно юзать as references and pointers"
Дык, всё можно юзать и как ссылку и как указатель. Какие проблемы? На самом деле разница между ссылкой и указателем больше семантическая, реализуются же они одинаково. Плюс значение ссылки не может быть изменено. Появились они в C++ благодаря перегрузке операторов, т.к. передавать параметры по значению неэффективно, а подогнать синтаксис языка под указатели было крайне проблемантично.
ЮБ>Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?
В этом нет никакого смысла.
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: virtual base class для чего обычно юзается?
Здравствуйте IT, Вы писали:
IT>Здравствуйте Юнусов Булат, Вы писали:
ЮБ>>За точную формалировку не ручаюсь, один из вариантов ответов про них был такой: "их можно юзать as references and pointers"
IT>Дык, всё можно юзать и как ссылку и как указатель. Какие проблемы? На самом деле разница между ссылкой и указателем больше семантическая, реализуются же они одинаково. Плюс значение ссылки не может быть изменено. Появились они в C++ благодаря перегрузке операторов, т.к. передавать параметры по значению неэффективно, а подогнать синтаксис языка под указатели было крайне проблемантично.
ЮБ>>Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?
IT>В этом нет никакого смысла.
Персональное Спасибо всем Троим, кто откликнулся.
А хорошее число
Re[8]: virtual base class для чего обычно юзается?
Здравствуйте IT, Вы писали:
ЮБ>>Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?
IT>В этом нет никакого смысла.
Может не поверишь, Игорь, но иногда небольшой смысл есть . С virtual наследованием (хотя эта вещь закладывалась как раз для полиморфного наследования) можно делать вот такую вещь
class CA
{
public:
CA() : m_nA(0) { }
CA(int nA) : m_nA(nA) { }
protected:
int m_nA;
};
class CB : virtual public CA
{
public:
CB(int nB) : CA(nB), m_nB(nB) { }
protected:
int m_nB;
};
class CC : public CB
{
public:
CC() : CB(1), m_nC(1) { }
CC(int nC) : CB(nC), CA(nC), m_nC(nC) { }
protected:
int m_nC;
};
CC с0;
CC с1(1);
При виртуальном наследовании, в конструкторе наследника (любого уровня) мы должны указывать как инициализируется базовый виртуальный класс. Если в списке инициализации конструктора наследника, явно не указан конструктор базового виртуального класса, то будет использоваться конструктор по умолчанию (если такового нет, то компилятор выдаст ошибку). Таким образом, в наследнике любого уровня, легко можно проинициализировать базовый класс (в TurboVision было похожее использование виртуального наследования). Не спорю, что, то же самое можно сделать и без виртуального наследования, удобно это или нет, решать самому.
В моем примере после инициализации, объекты будут иметь следующие данные
c0 = {m_nA = 0, m_nB = 1, m_nC = 1 } // а не {m_nA = 1, m_nB = 1, m_nC = 1 } как может показаться
c1 = {m_nA = 1, m_nB = 1, m_nC = 1 }
Re[9]: virtual base class для чего обычно юзается?
Вот примерно такой пример кода на бенче и был, причем в мономорфном наследовании.
Оттого, собственно и спрашиваю.
Вроде теперь ясно, это чтобы хитро управлять инициализацией какого нибудь класса вплоть до самых далеких предков, если какая нибудь (нестандартная) надобность возникнет.
Только както это очень ненавязчиво происходит и неявно (для большинства наверно) программеров. Путаницы больше одним словом.
Re[10]: virtual base class для чего обычно юзается?
Здравствуйте Юнусов Булат, Вы писали:
ЮБ>Вроде теперь ясно, это чтобы хитро управлять инициализацией какого нибудь класса вплоть до самых далеких предков, если какая нибудь (нестандартная) надобность возникнет.
Нет, это только в мнономорфном (мне больше нравится слово одиночном) наследование так. Вообще то виртуальное наследование (думаю ты это знаешь) введено для того что бы при множественном наследовании, можно было сделать так, что в структуре объекта наследника был только один экземпляр какого-то базового класса (да же если каждая из подветвей иерархии наследует этот базовый класс). А хитрое управление инициализацией, это как следствие.
Re[11]: virtual base class для чего обычно юзается?
Здравствуйте Sashko, Вы писали:
S>Нет, это только в мнономорфном (мне больше нравится слово одиночном) наследование так.
Мне тоже по душе больше термин одиночное ( что ж я нерусский чтоли? ), да только лучше перепривыкнуть, а то и в книжках буржуинских, и в экзаменах термины такие, куда деваться. S>Вообще то виртуальное наследование (думаю ты это знаешь) введено для того что бы при множественном наследовании, можно было сделать так, что в структуре объекта наследника был только один экземпляр какого-то базового класса (да же если каждая из подветвей иерархии наследует этот базовый класс).
Это знаю S>А хитрое управление инициализацией, это как следствие.
А это теперь тоже знаю
Re[9]: virtual base class для чего обычно юзается?
Здравствуйте Sashko, Вы писали:
S>Может не поверишь, Игорь, но иногда небольшой смысл есть . С virtual наследованием (хотя эта вещь закладывалась как раз для полиморфного наследования) можно делать вот такую вещь
Прикольно, я закоментировал в твоём примере:
class CA
{
public:
// CA() : m_nA(0) { }
CA(int nA) : m_nA(nA) { }
};
и получил ошибку компиляции...
У кого-то из нас на форуме в ориджтне золотые слова: Век живи, век учись, а так дураком и помрёшь
Если нам не помогут, то мы тоже никого не пощадим.