C++ 多态性 1-- 父类强制转换为子类,关键字dynamic_cast

80 篇文章 0 订阅
#include <iostream>
#include <string>
using namespace std;
/*---------------------------------
     16-02 父类的强制转换 
---------------------------------*/
class father
{
public:
	void smart()
	{
		cout<<"父亲很聪明"<<endl;
	}
//	virtual void beautiful(){cout<<"父亲也很beautiful"<<endl;}
	virtual ~father(){cout<<"析构father"<<endl;}
};
class son:public father
{
public:
	virtual void beautiful(){cout<<"儿子也很帅"<<endl;}
	~son(){cout<<"析构son"<<endl;}
};
int main()
{
	father *pf;
	int choice=0;
	bool quit;
	while(1)
	{
		quit=false;
		cout<<"0)退出 1)父亲 2)儿子: ";
		cin>>choice;
		switch(choice)
		{
			case 0:
				quit=true;
				break;
			case 1:
				pf =new father;
				//pf->beautiful();
				break;
			case 2:
				pf =new son; //dynamic_cast可以对不同类之间的数据类型进行转换
				dynamic_cast<son*>(pf)->beautiful(); //它可以将一个基类的指针转换成派生类的指针
				pf->smart();
				delete pf;
				break;
			default:
				cout<<"请输入0到2之间的数字:";
				break;
		}
		if(quit)
			break;	
	}


	cout<<"程序结束"<<endl;
	return 0;
}



运行结果:

0)退出 1)父亲 2)儿子: 1
0)退出 1)父亲 2)儿子: 2
儿子也很帅
父亲很聪明
析构son
析构father
0)退出 1)父亲 2)儿子: 0
程序结束
Press any key to continue

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中有四种强制换,分别是reinterpret_cast、const_cast、static_cast和dynamic_cast。 reinterpret_cast用于进行底层的重新解释换,可以将一个指针或引用换为其他型的指针或引用,甚至可以将指针换为整数型。但是使用reinterpret_cast需要非常小心,因为它是一种非常危险的操作,可能会导致未定义的行为。 const_cast用于移除const属性,可以将const修饰的变量或指针换为非const型。这可以用于去除const限定符,从而修改被const修饰的变量的值。 static_cast用于进行常见的换,可以将一个表达式换为另一种型,例如基本数据型之间的换、父类指针或引用换为子类指针或引用、以及void指针和任意型的指针之间的换。但是需要注意,在进行父类子类换时,只有当父类指针或引用实际上指向了一个子类对象时,才能进行成功的换。 dynamic_cast用于在继承关系中进行安全的向下型(downcasting)。它可以将一个父类指针或引用换为子类指针或引用,同时会进行型检查,确保换是安全的。如果换失败,dynamic_cast会返回一个空指针或抛出一个std::bad_cast异常。 这四种强制换在不同的场景下有不同的应用,可以根据具体的需求选择合适的换方式。但是需要注意,在使用这些强制换时,一定要谨慎和慎重,确保换的安全性和正确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++中的换static_cast、dynamic_cast、const_cast和reinterpret_cast总结](https://download.csdn.net/download/weixin_38629976/12808232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++的四种换reinterpret_cast/const_cast/static_cast /dynamic_cast](https://blog.csdn.net/salmonwilliam/article/details/113941785)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C++四种cast换(const_cast、static_cast、dynamic_cast、reinpreter_cast)换运算符](https://blog.csdn.net/Dontla/article/details/130792118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值