问C++中两种保存数据方法的区别解决方法

问C++中两种保存数据方法的区别
需要用一个容器保存多种数据类型
暂时想到以下两种方法

1、
容器中存储CData结构
C/C++ code

class CData
{
public:
    enum _Type_DataType
    {
        DT_...,
        DT_...
    };
    void *m_pData;
    _Type_DataType m_type;
};

CData a = con.getData();
if(a.m_type == DT_STRING)
{
    string &str = &a.m_pData;
}




2、
容器中存储CDataBase*指针
C/C++ code

class CDataBase
{
    enum_Type_DataType{DT_STRING,DT_POINTER}...
    vritual _Type_DataType getDataType();
};

class CDataString : public CDataBase,string
{
    _Type_DataType getDataType(){return DT_STRING};
    ...     
}

CDataBase *p = con.getData();
if(p->getDataType()==DT_STRING)
{
    CString &pstr = *p;
}



从实用角度考虑哪种更好?
另外众神牛们有没有更合适的方法?

------解决方案--------------------
第二种
原因,拷贝值很昂贵,拷贝地址很廉价(如果你的结构大的话)
但是如果你的结构体不够大,对性能要求不是很高就第一种,不容易出错
------解决方案--------------------
存地址.
------解决方案--------------------
存地址是最好的,但是不熟练的话容易出错,如程序性能要求不高的话建议用第一种,不容易出错。

------解决方案--------------------
地址,对象进行拷贝,需要调用拷贝构造函数等,代价比较大