结构继承层次结构 - 动态向下转换

时间:2013-06-27 09:22:32

标签: c++ templates inheritance struct

我有以下两个在模板类和容器中定义的结构,它包含基类的元素,如下所示:

class template<typename T1, typename T2>
class TTestDataObject
{
private:
//base element
struct SDataContainerElement
  {
    T1* m_sData;
  };
//derived element
struct SInvalidDataContainerElement : SDataContainerElement
  {
    int m_eExpectedErrorCode;
  };

//container holding base elements
typedef std::map<T2, SDataContainerElement* > TDataContainer;

TDataContainer sCInvalidData;

public:
typedef TDataContainer::const_iterator TDataConstIterator;
}

我想实现一个方法,它可以从这个容器中提取信息,根据它有哪个元素,基类(SDataContainerElement)或派生类(SInvalidDataContainerElement)做不同的事情,我按如下方式实现:

template<typename TDataStruct, typename TDataEnum>
int TTestDataObject<T1, T2>::eGetExpectedError(T2 eIndex)
{

  TDataConstIterator sElement = sCInvalidData.find(eIndex);

 if(dynamic_cast<SInvalidDataContainerElement*>((sElement->second)) == NULL)
   return -1;
 else    
   return static_cast<int>(sElement->second->m_eExpectedError);
}

尝试编译会导致以下错误:

E2307 Type'TTestDataObject<BEREICHTYP,eTestDataBereichTyp>::SDataContainerElement' is not a defined class with virtual functions

我不明白这一点。任何人都可以向我解释这个错误,并向我展示一个解决方案吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

FAQ: Why does dynamic_cast only work if a class has at least 1 virtual method?中所述,我需要在基类中使用虚拟方法,如虚拟析构函数。

要使此代码正常工作,我只需添加

virtual ~SDataContainerElement(){};

到base - struct。谢谢!