C++中的Run Time Type Identification

/*======================================================================
RTTI: Run Time Type Identification
	typied<--->dynamic_cast
		对于一个纯虚函数被两个不同的类继承 这两个类有单独的成员函数
		void dosomething(Flyable *obj)
		{
			//判断obj的运行类型
			cout<<typeid(*obj).name()<<endl;
			obj->takeoff();
			obj->land();
			//调用不同的成员函数
			if(typeid(*obj)==typeid(Bird)
			{	
				Bird *bird=dynamic_cast<Bird*>(obj);//强制类型转换
									  目标类型 源类型
				………………
			}

		}
		//注意的地方
			dynamic_cast:
				1、只能用于指针和引用的转换
				2、要转换的类型中必须包含虚函数 没有虚函数就转换失败
				3、如果转换成功转为子类指针 转换失败返回NULL
			typeid返回type_info对象的引用
				如果想通过基类指针获得派生类的数据类型,基类必须带有虚函数
				对于typeid只能获取当前对象是基类还是子类 不能获取对象指针是基类还是子类
/*======================================================================*/
#include<iostream>
using namespace std;
class A
{
public:
	A() {}
	virtual ~A() {}
	virtual void test() = 0;
};
class B:public A
{
public:
	B() {}
	virtual ~B() {}
	void BB()
	{
		cout << "B特有的函数" << endl;
	}
	virtual void test() 
	{
		cout << "类B的test" << endl;
	}
};
class C:public A,public B
{
public:
	C() {}
	virtual ~C() {}
	void CC()
	{
		cout << "C特有的函数" << endl;
	}
	virtual void test()
	{
		cout << "类C的test" << endl;
	}
};

void Test(A *p)
{
	if (typeid(*p).name() == typeid(B).name())
	{
		//类型强制转换
		B *b=dynamic_cast<B*>(p);
		b->test();
		b->BB();
	}
	if (typeid(*p).name() == typeid(C).name())
	{
		//类型强制转换
		C *c = dynamic_cast<C*>(p);
		c->test();
		c->CC();
	}
}

int main()
{
	A *a1 = new B();
	Test(a1);
	A *a2 = new C();
	Test(a2);
	delete a1,a2;
	a1 = NULL;
	a2 = NULL;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值