关于C++的静态转换与动态转换问题

首先先给出一个基类Base和一个子类Derived

#pragma once
#include<string>
#include<iostream>
using std::string;
using std::cout;
class Base
{
public:
	Base();
	Base(string s):str(s){}
	virtual void print()
	{
		cout << str << " ";
	}
	~Base();
private:
	string str;

};
#pragma once
#include "Base.h"
class Derived :
	public Base
{
public:
	Derived();
	Derived(string s,int i):Base(s),ival(i){}
	void pinrt()
	{
		Base::print();
		cout << ival << "\n";
	}
	void print_ival()
	{
		cout << "仅输出ival的值" << ival << "\n";
	}
	~Derived();

private:
	int ival;
};

此处的Derived的父类是Base,然后我们来实验。

#include"Base.h"
#include"Derived.h"
#include<iostream>
#include<string>
using std::cout;
using std::endl;
using std::string;
int main()
{
	Base base("liu");
	Derived de("wang", 23);
	Base* pb = &base;
	Derived* p = &de;
	if (Derived * pd = static_cast<Derived*>(pb))//此处用于判断指针是否为空指针
	{
		cout << "change has gone";
		pd->print_ival();
	}
//此时,pb为Base类型的指针,转化为Derived也就是父类转化为子类,而且这里用的是static_cast也就是静态转换,所以系统会忽略检查,强行进行转换

}

此处的输出:“change has gone仅输出ival的值-858993460”。

说明了什么?也就是静态转换下的基类转化成子类竟然成功了!但是后面的ival值确是一个不知道什么的数。

这是因为,原本的pb指针里根本就没有ival这个值啊,所以即使强行转换成功了,但是成员并没有改变,所以这种转换具有风险性。

但是如果换成动态转换呢?

if (Derived * pd = dynamic_cast<Derived*>(pb))//此处用于判断指针是否为空指针
	{
		cout << "change has gone";
		pd->print_ival();
	}

那么pd就成为了空指针,也就是转换失败了,所以dynamic起的作用实际上是检查一下,子类中是否有多余的东西,使得转化过后使用子类的某些功能会发生错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值