Добрый день!
Наступил тут на грабли и не могу понять, как их обойти:
1. Есть интерфейс
class iComponent{
virtual void SomeMethod()=0;
...
}
2. Есть реализации
[code]
class RealComponent: public iComponent
{
virtual void SomeMethod()
{
doSomething();
}
}
[/ccode]
Реализации запханы в DLL.
3. Есть хост-аппликуха.
class Core: public iCore
{
void RegisterComponent(iComponent* pWhat)
{
// Сохраняем указатель в map или еще куда
}
iComponent* GetComponent(std::string& Name)
{
// Делаем map.find и возвращаем указатель
}
Планируется что-то вроде COMa:
Аппликуха грузит dll из указанной директории.
Ищет в них единственную экспортированную функцию initDll(iCore* pCore) и дергает ее.
Эта функция создает экземпляр реализации (RealComponent) и вызывает RegisterComponent
void initDll(iCore* pCore)
{
RealComponent* pComp = new RealComponent();
pCore->RegisterComponent(pComp);
}
Вот до этого момента все нормально.
Но при попытка дерунть doSomething(), используя указатель, хранящийся в мапе:
iComponent* pComp= CoreApp->GetComponent("SomeComponent");
pComp->doSomething(); // Booom :(
приводит к "Pure virtual function call". Указатель сам по себе правильный, но, похоже,
таблица виртуальных функций того..
Может подскажет кто, где именно у меня в ДНК ошибка?
Да, VC6.0