virtual base class для чего обычно юзается?
От: Юнусов Булат Россия  
Дата: 19.01.02 20:12
Оценка:
Доброго времени суток.Просветите пожалуйста.
Насколько я понимаю сабж это при множественном наследовании полезно чтоб данные не слишком пухли. А может для чего нибудь еще? Можно примерчик маленький? А то вот на бранйбенче куча вопросов с сабжем была на тесте — а я честно говоря и забыл что это такое, сдал в результате хреновенько, на три с копейками, ладно, сойдет для первого раза. Надо было вопросы куда нибудь соханять а я от волнительности чрезмерной запямятовал. Щас пытаюсь вспомнить и не получается
Спасибо
Булат
Re: virtual base class для чего обычно юзается?
От: Dr_Sh0ck Беларусь  
Дата: 19.01.02 23:13
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Доброго времени суток.Просветите пожалуйста.

ЮБ>Насколько я понимаю сабж это при множественном наследовании полезно чтоб данные не слишком пухли. А может для чего нибудь еще? Можно примерчик маленький? А то вот на бранйбенче куча вопросов с сабжем была на тесте — а я честно говоря и забыл что это такое, сдал в результате хреновенько, на три с копейками, ладно, сойдет для первого раза. Надо было вопросы куда нибудь соханять а я от волнительности чрезмерной запямятовал. Щас пытаюсь вспомнить и не получается
ЮБ>Спасибо
ЮБ>Булат


Если ты имеешь ввиду чисто виртуальные базовые классы, то нужны они чтобы объявить неизменный интерфейс, который в последствии будут реализовывать его потомки. И в последствии, например, вместо возвращения (передачи) указателя на к.-либо класс, возвращают (передают) указатель на этот базовый класс — данные в нем, как правило, не объявляются и это обеспечивает доступ к объекту только через его интерфейс. У Страуструпа про это чуть-чуть написано, в литературе по СОМ рассматривается лучше.
Do not fake yourself ;)
ICQ#: 198114726
Re[2]: virtual base class для чего обычно юзается?
От: IT Россия linq2db.com
Дата: 19.01.02 23:21
Оценка:
Здравствуйте Dr_Sh0ck, Вы писали:

ЮБ>>Насколько я понимаю сабж это при множественном наследовании полезно чтоб данные не слишком пухли. А может для чего нибудь еще? Можно примерчик маленький? А то вот на бранйбенче куча вопросов с сабжем была на тесте — а я честно говоря и забыл что это такое, сдал в результате хреновенько, на три с копейками, ладно, сойдет для первого раза. Надо было вопросы куда нибудь соханять а я от волнительности чрезмерной запямятовал. Щас пытаюсь вспомнить и не получается


DS>Если ты имеешь ввиду чисто виртуальные базовые классы, то нужны они чтобы объявить неизменный интерфейс, который в последствии будут реализовывать его потомки. И в последствии, например, вместо возвращения (передачи) указателя на к.-либо класс, возвращают (передают) указатель на этот базовый класс — данные в нем, как правило, не объявляются и это обеспечивает доступ к объекту только через его интерфейс. У Страуструпа про это чуть-чуть написано, в литературе по СОМ рассматривается лучше.


Похоже ты спутал "чисто виртуальные базовые классы" с "чисто абстрактными классами".
В принципе Булат сам ответил на свой вопрос: "полезно чтоб данные не слишком пухли". Всё остальное — средства достижения этой цели.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: virtual base class для чего обычно юзается?
От: Dr_Sh0ck Беларусь  
Дата: 19.01.02 23:24
Оценка:
Здравствуйте IT, Вы писали:

IT>Похоже ты спутал "чисто виртуальные базовые классы" с "чисто абстрактными классами".

IT>В принципе Булат сам ответил на свой вопрос: "полезно чтоб данные не слишком пухли". Всё остальное — средства достижения этой цели.

Виноват-с — бес попутал
Do not fake yourself ;)
ICQ#: 198114726
Re[3]: virtual base class для чего обычно юзается?
От: Dr_Sh0ck Беларусь  
Дата: 19.01.02 23:29
Оценка:
Коллеги, прошу простить мое невежество! Просвятите! Чем отличаются "чисто виртуальные" и "абстрактные" классы (про "чисто абстрактные" слышу впервые; "чисто" — наверное жаргон ). Неужели абстрактные — это те, у которых ВСЕ методы чисто витруальные?
Do not fake yourself ;)
ICQ#: 198114726
Re[4]: virtual base class для чего обычно юзается?
От: IT Россия linq2db.com
Дата: 19.01.02 23:35
Оценка:
Здравствуйте Dr_Sh0ck, Вы писали:

DS>Коллеги, прошу простить мое невежество! Просвятите! Чем отличаются "чисто виртуальные" и "абстрактные" классы (про "чисто абстрактные" слышу впервые; "чисто" — наверное жаргон ). Неужели абстрактные — это те, у которых ВСЕ методы чисто витруальные?


Абстрактные — это у которых ХОТЯ БЫ ОДИН метод не имеет реализации.

class a {
public:
  virtual void f() = 0;
};


В этом случае экземпляр такого класса не может быть создан. Но от такого класса можно наследоваться и перекрыть эту функцию. Прекрасным примером применения таких классов являются интерфеёсы COM.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: virtual base class для чего обычно юзается?
От: Dr_Sh0ck Беларусь  
Дата: 19.01.02 23:39
Оценка:
Здравствуйте IT, Вы писали:


IT> Абстрактные — это у которых ХОТЯ БЫ ОДИН метод не имеет реализации.


Так вот и я про то... Тогда что такое "чисто виртуальные" классы?
Do not fake yourself ;)
ICQ#: 198114726
Re[6]: virtual base class для чего обычно юзается?
От: Dr_Sh0ck Беларусь  
Дата: 19.01.02 23:52
Оценка:
А, извини — затупил — сам придумал и сам спрашиваю... (две ночи интернета сказываются)
Do not fake yourself ;)
ICQ#: 198114726
Re[6]: virtual base class для чего обычно юзается?
От: IT Россия linq2db.com
Дата: 19.01.02 23:53
Оценка:
Здравствуйте Dr_Sh0ck, Вы писали:

DS>Так вот и я про то... Тогда что такое "чисто виртуальные" классы?


Это понятие ввёл ты сам Речь шла о виртуальных базовых классах.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: virtual base class для чего обычно юзается?
От: Dr_Sh0ck Беларусь  
Дата: 20.01.02 00:00
Оценка:
Здравствуйте IT, Вы писали:

IT>Это понятие ввёл ты сам Речь шла о виртуальных базовых классах.


Спасибо, к этому времени я уже понял, что сегодня пора на заслуженный отдых
Do not fake yourself ;)
ICQ#: 198114726
Re[5]: virtual base class для чего обычно юзается?
От: Андрей Тарасевич Беларусь  
Дата: 20.01.02 09:33
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Dr_Sh0ck, Вы писали:


DS>>Коллеги, прошу простить мое невежество! Просвятите! Чем отличаются "чисто виртуальные" и "абстрактные" классы (про "чисто абстрактные" слышу впервые; "чисто" — наверное жаргон ). Неужели абстрактные — это те, у которых ВСЕ методы чисто витруальные?


IT> Абстрактные — это у которых ХОТЯ БЫ ОДИН метод не имеет реализации.


IT>
IT>class a {
IT>public:
IT>  virtual void f() = 0;
IT>};
IT>


IT>В этом случае экземпляр такого класса не может быть создан. Но от такого класса можно наследоваться и перекрыть эту функцию. Прекрасным примером применения таких классов являются интерфеёсы COM.


Строго говоря, "метод не имеет реализации" и "является чистим виртуальным" — это разные вещи. Никто не запрещает чисто виртуальному методу иметь реализацию:

class a {
public:
  virtual void f() = 0
    { ... }
};


Так что правильнее будет сказать, что абстрактным называется класс, у котрого имеется хотя бы один чистый виртуальный метод.

Но это с точки зрения формальной терминологии языка C++. На уровне проектирования абстрактным назвают класс, не предназанченный для самостоятельного инстанциирования (класс, декларирующий интерфейс). Есть ли у него чистые виртуальные методы — неважно.
Best regards,
Андрей Тарасевич
Re[6]: virtual base class для чего обычно юзается?
От: Юнусов Булат Россия  
Дата: 20.01.02 11:28
Оценка:
Спасибо всем, я правда не про абстрактные классы спросил, а про виртуальные

Кстати, насчет абстракнвых кстати на бенче тоже вопрос был:
За точную формалировку не ручаюсь, один из вариантов ответов про них был такой: "их можно юзать as references and pointers"
Ну с поинтерами понятно — в интерфейсном программировании так и делается, а вот использование их как референсов я не видел. И сам не пользовал.
Беда в том еще была что все остальные варианты овета были откровенно бредовые, тако что я поставил галочку здесь.
Потом проверить решил — оказалось правильно поставил


#include <iostream>
#include <vector>

using namespace std;

struct IRun
{
    virtual void Run() = 0;
};

struct ISetup
{
    virtual void Setup() = 0;
};

struct ITest : public IRun, public ISetup
{
};

class CTest : public ITest
{
public:
    CTest() {}
    virtual ~CTest() {}
    virtual void Setup() {}
    virtual void Run() { cout << "CTest::Run()" << endl; }
};

int main()
{
    vector <ITest *> data;
    for(int i=0; i<3; i++)
        data.push_back(new CTest);

    ITest &ref = *data.front();
    ref.Run();

    for(vector <ITest *>::iterator it = data.begin(); it != data.end(); ++it)
            delete (*it);

    data.clear();
    
    return 0;
}



Ладно, с абстрактными ясность вроде.

Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?
Re[6]: virtual base class для чего обычно юзается?
От: IT Россия linq2db.com
Дата: 20.01.02 15:40
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Но это с точки зрения формальной терминологии языка C++. На уровне проектирования абстрактным назвают класс, не предназанченный для самостоятельного инстанциирования (класс, декларирующий интерфейс). Есть ли у него чистые виртуальные методы — неважно.


В MC++ введено специальное ключевое слово для этого — __abstract.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: virtual base class для чего обычно юзается?
От: IT Россия linq2db.com
Дата: 20.01.02 16:04
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>За точную формалировку не ручаюсь, один из вариантов ответов про них был такой: "их можно юзать as references and pointers"


Дык, всё можно юзать и как ссылку и как указатель. Какие проблемы? На самом деле разница между ссылкой и указателем больше семантическая, реализуются же они одинаково. Плюс значение ссылки не может быть изменено. Появились они в C++ благодаря перегрузке операторов, т.к. передавать параметры по значению неэффективно, а подогнать синтаксис языка под указатели было крайне проблемантично.

ЮБ>Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?


В этом нет никакого смысла.
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: virtual base class для чего обычно юзается?
От: Юнусов Булат Россия  
Дата: 20.01.02 20:11
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Юнусов Булат, Вы писали:


ЮБ>>За точную формалировку не ручаюсь, один из вариантов ответов про них был такой: "их можно юзать as references and pointers"


IT>Дык, всё можно юзать и как ссылку и как указатель. Какие проблемы? На самом деле разница между ссылкой и указателем больше семантическая, реализуются же они одинаково. Плюс значение ссылки не может быть изменено. Появились они в C++ благодаря перегрузке операторов, т.к. передавать параметры по значению неэффективно, а подогнать синтаксис языка под указатели было крайне проблемантично.


ЮБ>>Насчет виртуальных базовых классов уточняю вопрос — имет ли смысл их использовать в мономорфной иерархии? Или это закончится плохо, или смысла опять таки нету просто?


IT>В этом нет никакого смысла.


Персональное Спасибо всем Троим, кто откликнулся.
А хорошее число
Re[8]: virtual base class для чего обычно юзается?
От: Sashko Россия http://www.dc.baika.ru/
Дата: 21.01.02 03:27
Оценка: 64 (12)
Здравствуйте 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 для чего обычно юзается?
От: Юнусов Булат Россия  
Дата: 21.01.02 04:01
Оценка:
Здравствуйте Sashko, Вы писали:

Вот примерно такой пример кода на бенче и был, причем в мономорфном наследовании.
Оттого, собственно и спрашиваю.
Вроде теперь ясно, это чтобы хитро управлять инициализацией какого нибудь класса вплоть до самых далеких предков, если какая нибудь (нестандартная) надобность возникнет.
Только както это очень ненавязчиво происходит и неявно (для большинства наверно) программеров. Путаницы больше одним словом.
Re[10]: virtual base class для чего обычно юзается?
От: Sashko Россия http://www.dc.baika.ru/
Дата: 21.01.02 04:22
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Вроде теперь ясно, это чтобы хитро управлять инициализацией какого нибудь класса вплоть до самых далеких предков, если какая нибудь (нестандартная) надобность возникнет.


Нет, это только в мнономорфном (мне больше нравится слово одиночном) наследование так. Вообще то виртуальное наследование (думаю ты это знаешь) введено для того что бы при множественном наследовании, можно было сделать так, что в структуре объекта наследника был только один экземпляр какого-то базового класса (да же если каждая из подветвей иерархии наследует этот базовый класс). А хитрое управление инициализацией, это как следствие.
Re[11]: virtual base class для чего обычно юзается?
От: Юнусов Булат Россия  
Дата: 21.01.02 04:47
Оценка:
Здравствуйте Sashko, Вы писали:

S>Нет, это только в мнономорфном (мне больше нравится слово одиночном) наследование так.

Мне тоже по душе больше термин одиночное ( что ж я нерусский чтоли? ), да только лучше перепривыкнуть, а то и в книжках буржуинских, и в экзаменах термины такие, куда деваться.
S>Вообще то виртуальное наследование (думаю ты это знаешь) введено для того что бы при множественном наследовании, можно было сделать так, что в структуре объекта наследника был только один экземпляр какого-то базового класса (да же если каждая из подветвей иерархии наследует этот базовый класс).
Это знаю
S>А хитрое управление инициализацией, это как следствие.
А это теперь тоже знаю
Re[9]: virtual base class для чего обычно юзается?
От: IT Россия linq2db.com
Дата: 21.01.02 05:23
Оценка:
Здравствуйте Sashko, Вы писали:

S>Может не поверишь, Игорь, но иногда небольшой смысл есть . С virtual наследованием (хотя эта вещь закладывалась как раз для полиморфного наследования) можно делать вот такую вещь


Прикольно, я закоментировал в твоём примере:

class CA
{
public:
//    CA() : m_nA(0) { }
    CA(int nA) : m_nA(nA) { }
};


и получил ошибку компиляции...
У кого-то из нас на форуме в ориджтне золотые слова: Век живи, век учись, а так дураком и помрёшь
Если нам не помогут, то мы тоже никого не пощадим.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.