Пожалуйста, не переносите вопрос в СОМ, так как, скорее он все же относится к С++.
Правильно ли я понимаю, что в COM в интерфейсах не используются вирт. деструкторы, так как разные компиляторы при их наличии могут строить неэквивалентные таблицы vtbl? Ну, т.е., допустим, VC добавляет виртуальные функции типа vector deleting destructor и scalar deleting destructor, а кто-нить другой — что-то другое и отсюда несовместимость?
Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
Здравствуйте, Аноним, Вы писали:
А>Пожалуйста, не переносите вопрос в СОМ, так как, скорее он все же относится к С++.
А>Правильно ли я понимаю, что в COM в интерфейсах не используются вирт. деструкторы, так как разные компиляторы при их наличии могут строить неэквивалентные таблицы vtbl? Ну, т.е., допустим, VC добавляет виртуальные функции типа vector deleting destructor и scalar deleting destructor, а кто-нить другой — что-то другое и отсюда несовместимость?
А>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
всё-таки в COM
В COM технологии деструкторы явно не вызываются. Они вызываются неявно из Release
Здравствуйте, Аноним, Вы писали:
А>Правильно ли я понимаю, что в COM в интерфейсах не используются вирт. деструкторы, так как разные компиляторы при их наличии могут строить неэквивалентные таблицы vtbl? Ну, т.е., допустим, VC добавляет виртуальные функции типа vector deleting destructor и scalar deleting destructor, а кто-нить другой — что-то другое и отсюда несовместимость?
Нет, неправильно. Интерфейсы не содержат деструкторов, т. к., во-первых, это не классы языка Си++. Программировать под COM на низком уровне можно и на Си, который классы не поддерживает. И нет там никаких деструкторов.
Во-вторых, интерфейс — это и по сути своей не класс. Нельзя создать экземпляр интерфейса, а значит, нельзя и уничтожить.
В-третьих, объектная модель COM определяет иной способ управления временем жизни объекта, нежели в Си++. В COM объект должен уничтожать себя сам при достижении нуля счетчиком ссылок в момент вызова IUnknown::Release(). Доступный извне деструктор не нужен.
А>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
Нет. Не сгенерирует.
Re[2]: виртуальные деструкторы
От:
Аноним
Дата:
04.08.03 11:26
Оценка:
ДА>Нет, неправильно. Интерфейсы не содержат деструкторов, т. к., во-первых, это не классы языка Си++. Программировать под COM на низком уровне можно и на Си, который классы не поддерживает. И нет там никаких деструкторов.
Я говорю ИМЕННО о классах С++, так как мне интересна реализация СОМ средствами ИМЕННО С++, и с этой точки зрения я имею дело с абстрактными классами.
А вот с твоим объяснением про использование СОМ в не ОО языке я согласен. Однако, если предположить что я всегда буду использовать С++ я мог бы использовать деструкторы.
ДА>Во-вторых, интерфейс — это и по сути своей не класс. Нельзя создать экземпляр интерфейса, а значит, нельзя и уничтожить.
Абстрактные классы в С++, как мы оба понимаем, могут содержать деструкторы (да хотя бы даже и не виртуальные, хоть это уже и бред). Согласен?
ДА>В-третьих, объектная модель COM определяет иной способ управления временем жизни объекта, нежели в Си++. В COM объект должен уничтожать себя сам при достижении нуля счетчиком ссылок в момент вызова IUnknown::Release(). Доступный извне деструктор не нужен.
Я не про СОМ спрашивал.
А>>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
ДА>Нет. Не сгенерирует.
Уверен? Покажи дизассемблинг конструирования в таком случае:
class ILaja
{
public:
virtual void fun() = 0;
};
class CoLaja:public ILaja
{
public:
virtual void fun()
{
}
};
void g()
{
CoLaja laja; //ну ка покажи, что здесь происходит?
}
Re[3]: виртуальные деструкторы
От:
Аноним
Дата:
04.08.03 11:47
Оценка:
Здравствуйте, Аноним, Вы писали:
ДА>>Нет, неправильно. Интерфейсы не содержат деструкторов, т. к., во-первых, это не классы языка Си++. Программировать под COM на низком уровне можно и на Си, который классы не поддерживает. И нет там никаких деструкторов.
А>Я говорю ИМЕННО о классах С++, так как мне интересна реализация СОМ средствами ИМЕННО С++, и с этой точки зрения я имею дело с абстрактными классами.
Правильно, абстрактный класс в Си++ используется для воплощения концепции интерфейса COM. Однако, т. к. COM абсолютно жестко регламентирует порядок взаимодействия с серверами, причем способом, не зависящим от языка, если ты пишешь для COM, ты абсолютно ограничен правилами, принятыми в COM, а не в Си++.
А>А вот с твоим объяснением про использование СОМ в не ОО языке я согласен.
Не понял.
А>Однако, если предположить что я всегда буду использовать С++ я мог бы использовать деструкторы.
Нельзя сделать такого предположения. Кроме того, даже если бы и можно было, то все равно, деструкторы использовать нельзя.
Си++ сам по себе не содержит средств компонентного программирования. Конструктор/деструктор — понятия, применяемые в "монолитном", а не в компонентном программировании. COM — прежде всего компонентная модель, и использовать правила, годные для построения "монолитных" программ, тут не удастся.
ДА>>Во-вторых, интерфейс — это и по сути своей не класс. Нельзя создать экземпляр интерфейса, а значит, нельзя и уничтожить.
А>Абстрактные классы в С++, как мы оба понимаем, могут содержать деструкторы (да хотя бы даже и не виртуальные, хоть это уже и бред). Согласен?
См. выше.
ДА>>В-третьих, объектная модель COM определяет иной способ управления временем жизни объекта, нежели в Си++. В COM объект должен уничтожать себя сам при достижении нуля счетчиком ссылок в момент вызова IUnknown::Release(). Доступный извне деструктор не нужен.
А>Я не про СОМ спрашивал.
Вот так так! А про что?
А>>>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
ДА>>Нет. Не сгенерирует.
А>Уверен? Покажи дизассемблинг конструирования в таком случае:
А>
Здравствуйте, Аноним, Вы писали:
А>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
Наверное да. Но если использовать __declspec(novtable), то не поместит.