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

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的长度,释放的时候就报错了

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80814581