C++面向对象程序设计中如何判断一个对象的类类型

在C++面向对象程序设计中,有时候需要判断某个对象的类类型,那么可以有下列两种方法:

方法1: 采用 typeid()函数进行判断:(缺点:当存在继承,并且子类指针赋值给父类指针时,此时判断的对象类型为父类型,而不是子类类型)

 

对于一个父类CFather,其有两个子类CChildOne,CChildTwo。那么如何判断一个对象的类类型。如:

CChildOne objChildOne;

ChildTwo* pChildTwo;

if(typeid(objChildOne) ==typeid(CChildOne))

{

Cout<<”该对象的类类型为CChildOne”<<endl;

}

if(typeid(*pChildTwo) ==typeid(CChildTow))

{

Cout<<”该对象的类型为CChildTwo”<<endl;

}

 

但是这种方法好像存在问题:如CFirstChild类是CSuper的子类:

CFirstChild* pChild = new CFirstChild("米兰");

    if(typeid(*pChild) ==typeid(CFirstChild))

    {

       cout<<"CFirstChild"<<endl;  //此处是子类对象,没问题

    }

 

    CSuper*pObj = pChild; //此处变成了父类对象,不是子类对象了

    if(typeid(*pObj) == typeid(CSuper))

    {

       cout<<"CSuper"<<endl; //所以执行该条件

    }

    if(typeid(*pObj) == typeid(CFirstChild))

    {

       cout<<"CFirstChild"<<endl;

    }

 

    CSuper*pObj2 = new CFirstChild("国米");//此处变成了父类对象,不是子类对象了

    if(typeid(*pObj2) == typeid(CSuper))

    {

       cout<<"CSuper"<<endl; //所以执行该条件

    }

    if(typeid(*pObj2) == typeid(CFirstChild))

    {

       cout<<"CFirstChild"<<endl;

    }

 

    delete pChild;

    delete pObj2;

 

方法2:最好的方法是定义虚函数返回类类型

 

在运行时类型识别,最简单的办法就是所有的类(父类和子类)实现一个虚方法返回类名字,根据返回类名字再利用typeid()进行判断。如:

定义国家父类CCounty,

其中virtual CCounty* GetClassType(void);返回其类类型:

CCounty* CCounty::GetClassType(void)

{

    return this;

}

定义子类:CUSA,同时实现虚函数virtual CUSA*GetClassType(void);

CUSA* CUSA::GetClassType(void)

{

    return this;

}

定义子类:CIraq,同时实现虚函数virtual CIraq*GetClassType(void);

CIraq* CIraq::GetClassType(void)

{

    return this;

}

 

这样在使用的时候直接调用该虚函数GetClassType()就可以返回相应的类名称,采用typeid()就可以判断其相应的类型了。如:

CCounty* pCounty = new CUSA();

if(typeid(*(pCounty->GetClassType()))== typeid(CUSA))//此处是子类型CUSA

而:

CCounty* pCounty = new CIraq();

if(typeid(*(pCounty->GetClassType()))== typeid(CIraq))//此处是子类型CIraq

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值