/*条款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;
}
条款27 尽量少做转型动作
最新推荐文章于 2020-07-27 14:55:46 发布