从二叉搜索树(Binary Search Tree)入手,学习C++中类的构建 --(四)未完成。占坑。C++下的强制类型转换带来的问题

更新:看得多了,发现自己对C++的理解不到位,这篇文章先冻结。

占坑。未完成。

class book {
public:
	int a;
	int b;

	book(): a(9),b(-1){}
	virtual void print33(){cout<<(a*10)<<std::endl;}
	void print1(){cout<<"asd"<<std::endl;}
	void print12(){cout<<a+1<<std::endl;}

};

class novel : public book {
public:
	int num;
	int a;
	void print(){cout<<"heheda\n"<<std::endl;}
	virtual void print123(){cout<<"heheda\n"<<std::endl;}
	novel(): num(11){}
};

int main()
{
	book history;
	novel GoneWith;
	(dynamic_cast<book*> (&GoneWith))->print12();
	/*GoneWith因为cast而收缩了自己的范围,因此GoneWith的print成员不能用*/
	//int cd = (dynamic_cast<novel*> (&history))->num;
	/*卧槽这cd怎么能用?只是扩大指针的范围,你后面那片还是没数据啊*/
	/*看来没有调动构造函数,只是读取了一片未定义内存*/
	/*果断这个是不安全的!有时会报错*/
	//(dynamic_cast<novel*> (&history))->print12();/*history拓展为一个novel*/
	//history转化为novel,那么它就能去寻找novel下的函数.说明这些函数是单独放出来的。
	/*print33没有问题,动态绑定的。而print:history 并没有合适的空间来存放print函数,说明这个print不以函数表的形式存在,而是静态*/
	/*这里报错了,访问冲突。问题出在变量a的访问有问题*/
	/*只是编译器认为它的边界拓展,等访问的时候就会访问一个把原来的a覆盖的、内存中不存在的a*/
	/*可见,强制转换带来的不安全性。尤其是负责较小空间的指针转换成负责较大空间的指针时*/
	
	/*问题二,各种cast的结果不同*/
	(dynamic_cast<novel*> (&history))->print12();/*history拓展为一个novel,报错*/
	(reinterpret_cast<novel*> (&history))->print12();/*history拓展为一个novel,可运行输出10*/
	(static_cast<novel*> (&history))->print12();/*history拓展为一个novel,输出10 ---》说明访问的是book::a而不是novel::a */

	return 0;
}

还没研究明白

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值