运行时类型识别

本文详细介绍了C++中运行时类型识别的概念,包括dynamic_cast和typeid的使用方法。dynamic_cast用于在多态类型之间进行安全的类型转换,而typeid则用于获取对象或类型信息的运行时类型。通过示例代码,展示了如何在实际编程中应用这两个工具来判断和处理不同类型的对象。
摘要由CSDN通过智能技术生成

运行时类型识别

允许在运行时通过基类指针(或引用)辨别对象所属的具体派生类; 只对多态类型适用; 比虚函数动态绑定的开销更大,因此应仅对虚函数无法解决的问题使用。

运行时类型识别的方式

用dynamic_cast做类型转换的尝试; 用typeid直接获取类型信息。

dynamic_cast的使用:

语法形式

dynamic_cast<目的类型>(表达式)

功能

将基类指针转换为派生类指针,将基类引用转换为派生类引用; 转换是有条件的 如果指针(或引用)所指对象的实际类型与转换的目的类型兼容,则转换成功进行; 否则如执行的是指针类型的转换,则得到空指针;如执行的是引用类型的转换,则抛出异常。

例:

#include <iostream>
using namespace std;
class Base {
public:
	virtual void fun1() { cout << "Base::fun1()" << endl; }
	virtual ~Base() { }
};
class Derived1: public Base {
public:
	virtual void fun1() { cout << "Derived1::fun1()" << endl; }
	virtual void fun2() { cout << "Derived1::fun2()" << endl; }
};
class Derived2: public Derived1 {
public:
	virtual void fun1() { cout << "Derived2::fun1()" << endl; }
	virtual void fun2() { cout << "Derived2::fun2()" << endl; }
}; 
void fun(Base *b) {
	b->fun1();
	//尝试将b转换为Derived1指针
	Derived1 *d = dynamic_cast<Derived1 *>(b);
	//判断转换是否成功
	if (d != 0) d->fun2();
}
int main() {
	Base b;
	fun(&b);
	Derived1 d1;
	fun(&d1);
	Derived2 d2;
	fun(&d2);
	return 0;
}

typeid的使用:

语法形式

typeid ( 表达式 )

typeid ( 类型说明符 )

功能

获得表达式或类型说明符的类型信息

表达式有多态类型时,会被求值,并得到动态类型信息; 否则,表达式不被求值,只能得到静态的类型信息。 类型信息用type_info对象表示,type_info是typeinfo头文件中声明的类; typeid的结果是type_info类型的常引用; 可以用type_info的重载的“==”、“!=”操作符比较两类型的异同; type_info的name成员函数返回类型名称,类型为const char *。

例:

#include <iostream>
#include <typeinfo>
using namespace std;

class Base {
public:
	virtual ~Base() { }
};

class Derived: public Base { };
void fun(Base *b) {
	//得到表示b和*b类型信息的对象
	const type_info &info1 = typeid(b);
	const type_info &info2 = typeid(*b);
	cout << "typeid(b): " << info1.name() << endl;
	cout << "typeid(*b): " << info2.name() << endl;
	if (info2 == typeid(Base)) //判断*b是否为Base类型
		cout << "A base class!" << endl;
}

int main() {
	Base b;
	fun(&b);
	Derived d;
	fun(&d);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值