dynamic_cast与typeit及虚函数知识点

/*
带虚函数与不带虚函数转换的区别。

dynamic_cast:必须要有虚函数才可以转换。
dynamic_cast:只能处理转换指针或引用,不能转换对象。
dynamic_case 只能识别多态数据类型,转换失败就是null
多态,父类指针可以根据多态转化为子类指针
子类指针存储一个父类指针,转换失败。指针为 00000
子类指针转换成父类,自动转换。

typeid:自动识别类型,依赖于虚函数


//虚函数重载和返回值无关,和参数个数,顺序有关。
//虚函数被继承下来了还是虚函数。
//如果要使用被继承的虚函数,不允许出现虚函数 重载 ,这是C++编译器的问题。
//多态可以跨类。爷爷辈的指针,可以存储孙子辈的地址、父辈拔针的地址

*/
#include<iostream>
using namespace std;
/*
没有虚函数的情况下,子类同名函数会覆盖父类,
父类指针存储子类地址:
				1、有虚函数情况:调用子类方法
				2、没有虚函数情况:调用父类方法
*/

class base1
{
public:
	
	virtual void show()
	{
		cout << "base1->show" << endl;
	}
};

class baseX :public base1
{
public:
	void show()
	{
		cout << "baseX->show" << endl;
	}
};

class base2
{
public:
	
	void show()
	{
		cout << "base2->show" << endl;
	}
};

class baseY :public base2
{
public:
	void show()
	{
		cout << "baseY->show" << endl;
	}
};

void main08_A()
{
	baseX *px = new baseX;
	px->show();

	base1 *p1 = new baseX;  //父类指针,指向子类地址
	p1->show();

	//typeid:自动识别类型,依赖于虚函数
	//有虚函数的 *p1 是 baseX 类型  没有是 base1类型,typeid:自动识别类型。
	cout << typeid(p1).name() << endl;	//p1:class base1 *
	cout << typeid(*p1).name() << endl;//*p1:class baseX 的对象,因为虚函数的存在,检测到*p 为class baseX 的对象.	
	
	baseY *py = new baseY;
	py->show();

	base2 *p2 = new baseY;
	p2->show();

	cout << typeid(p2).name() << endl;
	cout << typeid(*p2).name() << endl;

	// dynamic_case 只能识别多态数据类型,转换失败就是null
	//dynamic_cast:必须要有虚函数才可以转换。
	baseX *pX = dynamic_cast<baseX *>(p1);
	pX->show();

	//dynamic_case 只能识别多态数据类型。所以下面这句的转换失败!
	//baseY *pY = dynamic_cast<baseY *>(p2);
	//pY->show();

	cin.get();
}

void main08_B()
{
	//多态,父类指针可以根据多态转化为子类指针
	//子类指针存储一个父类指针,转换失败。指针为 00000	
	base1 *p1 = new base1;
	base1 *p2 = new baseX;

	baseX *px = dynamic_cast<baseX *>(p1);  //使用子类指针存储一个父类指针。
	//px->show(); //可以通过编译,但是执行会崩溃。
	//打印地址可以看看,地址为:0000000 
	cout << "px:"<<(void *)px << endl;

	cin.get();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值