C ++はstatic_castとdynamic_castの違い

dynamic_cast演算子、基本クラスへのポインタまたは参照を安全に派生クラスへのポインタまたは参照に変換されます。

我々ポインタまたはレファレンスの特定の種類の両方演算子、仮想関数の種類が含まれ、オペレータは、ポインタや参照オブジェクトを使用する場合、動的型を結合しました

3つの形態で使用

dynamic_castを<タイプ*>(E) // eはポインタでなければならない
のdynamic_cast <タイプ&>(E) // eは、 左の値でなければなりません
// Eのdynamic_cast <タイプ&&>( 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 ++プライマー第5版730

公開された43元の記事 ウォンの賞賛1 ビュー2300

おすすめ

転載: blog.csdn.net/lpl312905509/article/details/104046600