C++工作笔记-对static_cast的进一步认识(强制转换改变内存,并且删除存在的问题)

388 篇文章 20 订阅

static_cast关键字(编译时类型检查)


代码如下:

#include <iostream>
using namespace std; 

class Base{
public :
	Base(const int baseData){
		m_baseData = baseData;
	}
	void print()const{
		cout << "m_baseData is " << m_baseData << endl;
	}
private:
	int m_baseData;
};

class Upgrade :public Base{
public:
	Upgrade(const int upgradeData) :Base(upgradeData){
		m_upgradeData = upgradeData;
	}
	void setGradeData(const int &data){
		m_upgradeData = data;
	}
	void print()const{
		cout << "m_upgradeData is " << m_upgradeData << endl;
	}
private:
	int m_upgradeData;
};

int main(){
	double double_1 = 100.0001;
	int a = static_cast<int>(double_1);
	cout << "double_1 is " << double_1 << endl;
	cout << "a is " << a << endl;

	Base *base = new Base(100);
	cout << "base print:";
	base->print();
	Upgrade *upgrade = new Upgrade(101);
	cout << "upgrade print:";
	upgrade->print();

	Base *castBase1 = static_cast<Base*>(upgrade);
	cout << "castBase1 print:";
	castBase1->print();

	Upgrade *caseUpgrade1 = static_cast<Upgrade*>(upgrade);
	cout << "caseUpgrade1 print:";
	caseUpgrade1->print();

	Upgrade *caseUpgrade2 = static_cast<Upgrade*>(base);
	cout << "caseUpgrade2 print:";
	caseUpgrade2->print();

	Upgrade *caseUpgrade3 = (Upgrade*)base;
	cout << "caseUpgrade3 print:";
	caseUpgrade3->print();

	cout << "sizeof(*caseUpgrade3):" << sizeof(*caseUpgrade3) << endl;
	caseUpgrade3->setGradeData(1);
	cout << "sizeof(*caseUpgrade3):" << sizeof(*caseUpgrade3) << endl;

	Base *base_base = upgrade;
	cout << "base_base print:";
	base_base->print();

	delete upgrade;
	//delete base;
	
	getchar();
	return 0;
}

运行截图如下:



这里就提一点:

Upgrade *caseUpgrade3 = (Upgrade*)base;
	cout << "caseUpgrade3 print:";
	caseUpgrade3->print();

	cout << "sizeof(*caseUpgrade3):" << sizeof(*caseUpgrade3) << endl;
	caseUpgrade3->setGradeData(1);
	cout << "sizeof(*caseUpgrade3):" << sizeof(*caseUpgrade3) << endl;

	Base *base_base = upgrade;
	cout << "base_base print:";
	base_base->print();

	delete upgrade;
	//delete base;

这里把子类指针强指到了父类,并且还修改了子类的值,这真是个骚包的操作!!!






我的电脑是小端系统。

但是不能对base进行析构,会报如下的错误。

delete base;




原因是:分配了len长度的空间,却用到了len + 1的长度,释放的时候就报错了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值