виртуальные деструкторы
От: Аноним  
Дата: 04.08.03 10:48
Оценка:
Пожалуйста, не переносите вопрос в СОМ, так как, скорее он все же относится к С++.

Правильно ли я понимаю, что в COM в интерфейсах не используются вирт. деструкторы, так как разные компиляторы при их наличии могут строить неэквивалентные таблицы vtbl? Ну, т.е., допустим, VC добавляет виртуальные функции типа vector deleting destructor и scalar deleting destructor, а кто-нить другой — что-то другое и отсюда несовместимость?

Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)
Re: виртуальные деструкторы
От: icWasya  
Дата: 04.08.03 11:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пожалуйста, не переносите вопрос в СОМ, так как, скорее он все же относится к С++.


А>Правильно ли я понимаю, что в COM в интерфейсах не используются вирт. деструкторы, так как разные компиляторы при их наличии могут строить неэквивалентные таблицы vtbl? Ну, т.е., допустим, VC добавляет виртуальные функции типа vector deleting destructor и scalar deleting destructor, а кто-нить другой — что-то другое и отсюда несовместимость?


А>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)


всё-таки в COM

В COM технологии деструкторы явно не вызываются. Они вызываются неявно из Release
Re: виртуальные деструкторы
От: Другой Аноним  
Дата: 04.08.03 11:17
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Правильно ли я понимаю, что в 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(). Доступный извне деструктор не нужен.


А>Я не про СОМ спрашивал.


Вот так так! А про что?

А>>>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)


ДА>>Нет. Не сгенерирует.


А>Уверен? Покажи дизассемблинг конструирования в таком случае:


А>
А>class ILaja
А>{
А>public:
А>    virtual void fun() = 0;
А>};

А>class CoLaja:public ILaja
А>{
А>public:
А>    virtual void fun()
А>    {
А>    }
А>};

А>void g()
А>{
А>    CoLaja laja; //ну ка покажи, что здесь происходит?
А>}
А>


К интерфейсу это не имеет отношения.
Re: виртуальные деструкторы
От: plads_project  
Дата: 04.08.03 13:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Интерфейс содержит только чисто виртуальные функции. Но ведь где-то компилятор сгенерит и поместит определение конструктора/конструктора копий? (который будет вптры устанавливать?)


Наверное да. Но если использовать __declspec(novtable), то не поместит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.