问:在c++里怎么能知道一个变量的具体类型,如:c#里的typeof.还有我怎么知道一个变量的类型是某个类型的子类,也就是实现关键字IS
答:
1。运行时获知变量类型名称,可以使用
typeid(变量).name,需要注意不是所有编译器都输出"int"、"float"等之类的名称,对于这类的编译器可以这样使用:float f = 1.1f;
if( typeid(f) == typeid(0.0f) )
……
2。对于多态类实例,想得到实际的类名称,需要使用到RTTI,这需要在编译的时候加上参数"/GR"。
3。对于普通变量,既然是自己写的,那当然也就应该知道它的类型,其实用不着运行时获知;对于多态类实例,既然需要运行时获知实际类型,那么就说明这里不具有多态性,既然没有多态性就不应该抽象它,这属于设计错误,总之,我认为RTTI是多余的。
4。对于多态类实例,使用
typeid(value) == typeid(value)来判断,不如使用 dynamic_cast
来判断,它们的原理是一样的。
事例代码:
#include
using namespace
std;
int main( void )
{
// sample 1
cout <<
typeid(1.1f).name() << endl;
// sample 2
class
Base1
{
};
class Derive1 : public
Base1
{
};
Derive1 d1;
Base1& b1 =
d1;
cout << typeid(b1).name() << endl; // 输出"class
Base1",因为Derive1和Base1之间没有多态性
// sample 3, 编译时需要加参数 /GR
class
Base2
{
virtual void fun( void ) {}
};
class
Derive2 : public Base2
{
};
Derive2 d2;
Base2&
b2 = d2;
cout << typeid(b2).name() << endl; // 输出"class
Derive2",因为Derive1和Base1之间有了多态性
// sample 4
class Derive22 : public
Base2
{
};
//
指针强制转化失败后可以比较指针是否为零,而引用却没办法,所以引用制转化失败后抛出异常
Derive2* pb1 =
dynamic_cast(&b2);
cout << boolalpha <<
(0!=pb1) << endl; // 输出"true",因为b2本身就确实是Derive2
Derive22* pb2 =
dynamic_cast(&b2);
cout << boolalpha <<
(0!=pb2) << endl; // 输出"true",因为b2本身不是Derive2
try
{
Derive2& rb1 =
dynamic_cast(b2);
cout << "true" <<
endl;
} catch( bad_cast )
{
cout << "false"
<< endl;
}
try {
Derive22& rb2 =
dynamic_cast(b2);
cout << "true" <<
endl;
} catch( ... ) // 应该是
bad_cast,但不知道为什么在VC++6.0中却不行
{
cout << "false" <<
endl;
}
return 0;
}
阅读(2092) | 评论(12) | 转发(0) |