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

来源:互联网 发布:电脑评测软件 编辑:程序博客网 时间:2024/06/01 08:51
C++面向对象程序设计中如何判断一个对象的类类型

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

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

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

  CChildOne objChildOne;

  ChildTwo* pChildTwo;

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

  {

  Cout$amp;

  }

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

  {

  Cout$amp;

  }

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

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

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

  {

  cout$amp;

  }

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

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

  {

  cout$amp;

  }

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

  {

  cout$amp;

  }

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

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

  {

  cout$amp;

  }

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

  {

  cout$amp;

  }

  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


原文地址:http://www.educity.cn/wenda/250290.html

0 0