C++ static_cast与dynamic_cast的区别

dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用。

当我们将这两个运算符用于某种类型的指针或引用时,并且该类型含有虚函数,运算符将使用指针或引用所绑定对象的动态类型

三种使用形式

dynamic_cast<type*> (e) //e必须为指针
dynamic_cast<type&> (e) // e 必须为一个左值
dynamic_cast<type&&> (e) //e不能是左值

//有虚函数
class A
{
public:
	A() {}
	virtual ~A() {}
};

class B :public A
{
public:
	B() {}
	virtual ~B() {}
};

class C :public B
{
public:
	C() {}
	virtual ~C() {}
};

class D :public B, public A
{
public:
	D() {}
	virtual ~D() {}
};


//没有虚函数
class E
{
public:
	E() {}
	~E() {}
	void get() 
	{
		printf("eeeeeeeeeeee\n");
	}
};

class F:public E
{
public:
	F() {}
	~F() {}
	void get() 
	{
		printf("ffffffffffff\n");
	}
};

int main()
{
	A *pa = new C;
	if (B *pb = dynamic_cast<B*>(pa))
	{
		cout << "True" << endl;
	}
	else
	{
		cout << "False" << endl;
	}//因为指针类型的转换失败返回为0可以使用条件中赋值判断

	try
	{
//		D &cp = dynamic_cast<D&>(*pa);//错误 只能派生类转父类
		C &cp = dynamic_cast<C&>(*pa);//正确,*pa的类型是C  
		cout << "cp" << endl;
	}
	catch (std::bad_cast e)
	{
		cout << e.what() << endl;
	}//引用类型失败返回的是bad_cast  

	B *pbb = new B;
//	if (C *pc = static_cast<C*>(pbb)) //用static_cast 则可以转成功
	if (C *pc = dynamic_cast<C*>(pbb))
	{
		cout << "True" << endl;
	}
	else
	{
		cout << "False" << endl;
	}

	A *paa = new D;
	if (B *pc = dynamic_cast<B*>(paa))
	{
		cout << "True" << endl;
	}
	else
	{
		cout << "False" << endl;
	}

	E* pe = new E;
	E* pf = new F;

//	F* pg = dynamic_cast<F*>(pe); //基类转派生类 必须要有虚函数
	F* pg = static_cast<F*>(pe);  //使用static_cast 不会报错 但是有可能是不安全的
//	E* pg = dynamic_cast<E*>(pf); //派生类转基类 怎么转都是安全的
	printf("%d\n",&pg);
	//get 未定义成虚函数 不能形成多态
	pe->get(); // eeeeeeeeeee
	pf->get(); // eeeeeeeeeee


	system("pause");
	return 0;
}

本文截取 c++ primer 第五版 730页

发布了43 篇原创文章 · 获赞 1 · 访问量 2300

猜你喜欢

转载自blog.csdn.net/lpl312905509/article/details/104046600
今日推荐