C++ 当从DLL调用时,typeid不返回派生类
我正在使用C++ 当从DLL调用时,typeid不返回派生类,c++,templates,dll,polymorphism,typeid,C++,Templates,Dll,Polymorphism,Typeid,我正在使用typeid为我的应用程序生成调试输出。我依赖于typeid对基类的去引用指针的多态行为 现在我遇到了一个问题,要么是一个编译器错误,要么是一些奇怪的类型推断规则,乍一看并不明显 我有一个使用模板参数的公共基类,该参数在公共头文件中定义: class Type {}; template<typename T> class Base { virtual void dummy() {} }; 类类型{}; 模板类基类{virtual void dummy(){}; 然后我
typeid
为我的应用程序生成调试输出。我依赖于typeid
对基类的去引用指针的多态行为
现在我遇到了一个问题,要么是一个编译器错误,要么是一些奇怪的类型推断规则,乍一看并不明显
我有一个使用模板参数的公共基类,该参数在公共头文件中定义:
class Type {};
template<typename T> class Base { virtual void dummy() {} };
类类型{};
模板类基类{virtual void dummy(){};
然后我有两个DLL:
- 包含
的派生类及其实例的类Base
#include "commonheader.h" class Derived : public Base<Type> { }; Derived instance; main() { CallDLL(&instance); }
#包括“commonheader.h” 派生类:公共基{}; 派生实例; main(){CallDLL(&instance);}
- 还有一个功能是使用指向
的指针。使用第一个DLL中实例的地址调用此函数Base
#include "commonheader.h" void CallDLL(Base<Type>* b_ptr) { std::string typeName1 = typeid(*b_ptr).name(); std::string typeName2 = typeid(*&*b_ptr).name(); }
#包括“commonheader.h” void CallDLL(基本*b_ptr) { std::string typeName1=typeid(*b_ptr).name(); std::string typeName2=typeid(*&*b_ptr).name(); }
typeName1
应计算为“类派生”
,因为*b_ptr
是指向多态基类的未引用指针。然而,事实并非如此。结果是“类基”
。
最令人惊讶的是,当添加另一层间接寻址时,typeName2
实际上是“类派生的”
所以这里的主要问题是typeid(*b_ptr)!=typeid(*&*b_ptr)
,这永远不会发生。
如您所见,第二个版本解决了我最初的问题,即为b_ptr
所指向的最派生类获取调试输出名称。但我无法解释原因,我想知道这是否是我的预期行为
还有几点意见:
- 我正在使用VisualStudio2010。我还没有测试其他编译器
- 无法进一步简化问题:
- 将
的定义放在标题中会生成正确的输出派生的
- 将所有内容放在一个DLL(或EXE)中可以生成正确的输出
- 从
中删除模板参数将生成正确的输出Base
- 将