C++面向对象程序设计中如何判断一个对象的类类型
2013-09-19 18:42
399 查看
在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
方法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
相关文章推荐
- javascript 如何判断一个对象的类型
- 如何判断一个对象是否是基本类型的Wrapper
- C++面向对象程序设计中怎么判断一个对象的类类型
- Js中如何判断一个对象为数组类型
- Javascript如何判断一个变量是普通变量还是数组还是对象?
- js如何判断一个对象是不是Array?
- C/C++中如何判断一个输入的变量是否和其定义的类型一致
- 如何判断一个js对象是否一个DOM对象
- js里怎么判断一个对象是否是日期类型,即Date,用typeof返回的是object
- 【more effective c++读书笔记】【第5章】技术(7)——让函数根据一个以上的对象类型来决定如何虚化(1)
- jquery和js如何判断一个对象是否存在
- js如何判断一个对象是不是Array?
- js如何判断一个对象是不是Array?
- 【more effective c++读书笔记】【第5章】技术(7)——让函数根据一个以上的对象类型来决定如何虚化(2)
- 【Java】在Java中如何判断一个对象属于一个类
- 如何判断一个对象是否是可调用对象
- 判断一个变量类型是数组还是对象
- js如何判断一个对象是array ,instanceof 是基于什么实现的呢?
- 判断一个变量类型是数组还是对象
- 自定义类型的对象如何判断相等