条款27 尽量少做转型动作

/*条款27 尽量少做转型动作*/
#include<iostream>
#include<vector>
#include<memory>
using namespace std;
class Window{
public:
	virtual void onResize(){
		cout << "onResize()" << endl;
	}
	virtual void blink(){}
};
class SpecialWindow : public Window{
public:
	virtual void onResize(){
		//static_cast<Window>(*this).onResize();
		//这里调用的并不是当前对象上的函数,而是一个副本的onResize,如果,这个副本修改了某个成员,而实际的基类并未修改,这样基类部分未修改,而子类的修改倒是落实了“伤残状态”
		Window::onResize();//调用window::onResize作用于*this身上
	}
	void blink(){
		cout << "blink()" << endl;
	}
	/*在继承结构中,指向子类的基类指针是通过offset在运行期施行于基类指针,以取得正确的基类指针值,而且对象的布局方式和它们的地址计算方式随编译器的不同而不同。*/
};

	

int main(){
	SpecialWindow sw;
	sw.onResize();
	/*dynamic_cast设计多数编译器的实现版本基于“类名字符串比较”如果继承体系层数多,执行速度很慢
	而且dynamic_cast的应用场景只有一个指向子类对象的基类指针或引用,但你的意图是想执行子类对象的某些操作函数
	解决方法:如下*/
	//使用容器存储直接指向子类对象的(智能)指针 消除对指向子类的基类指针的需要
	typedef std::vector<std::tr1::shared_ptr<SpecialWindow>> VPW;
	VPW winPtrs;
	for (VPW::iterator it = winPtrs.begin(); it != winPtrs.end(); ++it){
		//if (SpecialWindow*psw = dynamic_cast<SpecialWindow*>(it->get()))
	//		psw->blink();
		//如果不希望使用dynamic_cast 如下
		(*it)->blink();//无法存储指向所有可能的各种Window的派生类,解决方法如下

	}
	typedef std::vector<std::tr1::shared_ptr<Window>> VPWIN;
	VPWIN wptrs;
	for (VPWIN::iterator it = wptrs.begin(); it != wptrs.end(); ++it){
		(*it)->blink();//无dynamic_cast 但是这里基类要有没有实现的blink
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值