关于C++类型转换的有关问题

关于C++类型转换的问题
本帖最后由 zwei41 于 2015-09-25 09:03:06 编辑
如下类,我需要一个方法判断传入指针是什么类型

class IData
{
public:
IData(){}
virtual ~IData(){}
}

class CDataName : public IData
{
public:
string GetName(){ return name;}
private:
string name;
}

class CDataAlias : public IData
{
public:
string GetAlias(){ return alias;}
private:
string alias;
}


class CDataOperate
{
public:
CDataOperate(){}
~CDataOperate(){}

void MyOperate(IData *in_data)
{
//if IData is CDataName, return name.
//if IData is CDataAlias, return alias.
//IData 可能存在多个子类,什么办法可以优化下面的逻辑,希望可以达到立马判断出类类型的方法
CDataName *tmp_data = (CDataName *)in_data;
if( tmp_data != null)
{
return NotifData(tmp_data);
}
CDataAlias *tmp_data1 = (CDataAlias *)in_data;
if( tmp_data1 != null)
{
return NotifData(tmp_data);
}
}

private:
void NotifData(CDataName *in_pdata)
{
printf("%s\n", in_pdata->GetName().c_str());
}
void NotifData(CDataAlias *in_pdata)
{
printf("%s\n", in_pdata->GetAlias().c_str());
}
}

------解决思路----------------------
在基类里声明一个纯虚的 enum XXX getClassType() =0; ,每个派生类返回自己的标志。
------解决思路----------------------
class IData
{
public:
    IData(){}
    virtual ~IData(){}
    virtual string GetName() = 0;
}
 
class CDataName : public IData
{
public:
    string GetName(){ return name;}
private:
    string name;
}
 
class CDataAlias : public IData
{
public:
    string GetName(){ return alias;}
private:
    string alias;
}
 
 
class CDataOperate
{
public:
    CDataOperate(){}
    ~CDataOperate(){}
     
    void MyOperate(IData *in_data)
    {
        //if IData is CDataName, return name.
        //if IData is CDataAlias, return alias.
        //IData 可能存在多个子类,什么办法可以优化下面的逻辑,希望可以达到立马判断出类类型的方法
        printf("%s\n", in_pdata->GetName().c_str());
    }
  }

------解决思路----------------------
如果要自己判断不同的派生类然后采取不同的做法,那就不该用继承,虚函数就是为了使用统一的接口来达到不同的效果。