template <class T> class TMyTemplate
{
protected:
T* m_pObject;
public:
// some functionsvirtual void MyFunction() { some code is here;}
};
class CMyClass;
typedef TMyTemplate<CMyClass> CMyTemplateClass;
Теперь есть некаяя dll, которая создает объект pTest типа CMyTemplateClass, и передает его в приложение.
Приложение вызывает pTest->MyFunction().
По логике вещей, в этой ситуации вызов MyFunction должен быть виртуальным и "пойти" работать внутри DLL.
Собственно вопрос: какие-то пункты стандарта регламентируют соответствующее поведение, или оно остается на усмотрение авторов компилятора?
_>Не понял вопрос. Виртуальная эта функция или нет, все равно код будет исполняться из того модуля, где этот класс реализован...
Виноват, не доглядел, что код метода встроен...
Тогда если в библиотеке есть явное инстаниирование шаблона, то будет вызван код из нее. Иначе код будет встроен в вызывающее приложение.
Здравствуйте, Croc, Вы писали:
C>Собственно вопрос: какие-то пункты стандарта регламентируют соответствующее поведение, или оно остается на усмотрение авторов компилятора?
DLL — это вещь сугубо платформенно-зависимая, а посему о них в стандарте языка не может быть и речи.
По существу: виртуальный вызов в твоем случае будет работать как положено. Если по каким-то причинам это не так, то было бы неплохо увидеть минимальный пример, иллюстрирующий проблему.
1. Поясняю, что технически код метода может иметь место в обоих модулях, и именно этот случай представляет интерес.
2. Еще раз напоминаю, что меня интересуют сугубо пункты стандарта, если он это регламентирует, нежели Ваше личное мнение (при всем моем уважении), просто потому, что у авторов компилятора может быть свое личное мнение, не совпадающее с мнением Вашим, и даже мнением большинства. Я именно так сформулировал свой вопрос.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Croc, Вы писали:
C>>Собственно вопрос: какие-то пункты стандарта регламентируют соответствующее поведение, или оно остается на усмотрение авторов компилятора?
B>DLL — это вещь сугубо платформенно-зависимая, а посему о них в стандарте языка не может быть и речи. B>По существу: виртуальный вызов в твоем случае будет работать как положено. Если по каким-то причинам это не так, то было бы неплохо увидеть минимальный пример, иллюстрирующий проблему.
Спасибо, собственно проблемы пока нет. В рамках одного модуля реализация выглядит "правильной": адрес вызова для этой функции берется из vfptr объекта.
Просто мой коллега хотел более веских аргументов (например, пунктов стандарта), которые бы это гарантировали, прежде чем внедрять такой шаблон в проект. В частности, имеют место вопросы (и у меня в том числе) "а будет ли это работать на других компиляторах?".
Здравствуйте, Croc, Вы писали:
C>Просто мой коллега хотел более веских аргументов (например, пунктов стандарта), которые бы это гарантировали, прежде чем внедрять такой шаблон в проект. В частности, имеют место вопросы (и у меня в том числе) "а будет ли это работать на других компиляторах?".
Шаблоны тут совершенно не при чем — механизм реализации виртуальных вызовов одинаков для шаблонов и для обычных классов. Однако этот механизм вполне может быть реализован по-разному на разных компиляторах, поскольку все это — implementation defined. Так что исполняемый модуль и dll, собранные разными компиляторами, вполне могут отказаться работать вместе.