У меня есть базовый абстрактный класс (interface
), который используется во многих библиотеках DLL для наследования. Каждая DLL имеет экспортированный фабричный символ, который динамически создает объект и возвращает его указатель. Что произойдет, если две разные библиотеки DLL будут иметь классы с одинаковым именем, унаследованные от одного и того же абстрактного класса?
class foo
{
public:
virtual void func()const=0;
};
Dll1
class bar: public foo
{
public:
virtual void func()const{
std::cout << "From Dll1" << std::endl;
}
};
Dll2
class bar: public foo
{
public:
virtual void func()const{
std::cout << "From Dll2" << std::endl;
}
};
Главный
int main()
{
foo* obj1;
foo* obj2;
// load DLLs
// import factory
// call factory to initialize objects
obj1->func(); // output: "From Dll1"
obj2->func(); // output: "From Dll2"
return typeid(*obj1) == typeid(*obj2);
}
Возвраты true
, означающие, что obj1
и obj2
созданы из одного и того же класса. Так же как typeid(*obj1).name()
и typeid(*obj2).name()
возвращает одно и то же имя class bar
. Могу ли я как-нибудь различить эти объекты с помощью RTTI
, если мне не разрешено управлять самими библиотеками DLL? Должен ли класс иметь механизм, обеспечивающий его UUID
для этого случая?
P.S. Как сказал IInspectable, вы можете сопоставить объект с его фабрикой. Но что, если интерфейс позволяет компилировать объекты? DLL никогда не будет различать объекты, возвращаемые из разных модулей, так как не знает фабрики. Это основная причина, по которой я хотел бы использовать RTTI
.