前两天看visitor设计模式,其中对于每个需要添加功能的类都要加上
public void accept(visitor v)
{
v.accept(this) ;
}
即使父类中已经实现了这个方法,子类中还要重写。
估计与this参数有关,今天写程序试了一下。
class employee;
class boss;
class visitor
{
public:
void visit(employee * e)
{
cout<<"this is in employee visit"<<endl;
}
void visit(boss * b)
{
cout<<"this is in boss visit"<<endl;
}
};
class employee
{
public:
void accept(visitor v)
{
v.visit(this);
}
};
class boss : public employee
{
public:
//必须对每一个类都重新写
//因为其中涉及到this指针的问题
void accept(visitor v)
{
v.visit(this);
}
};
void main()
{
visitor v;
boss b;
employee e;
b.accept(v);
e.accept(v);
}
如果boss类中的accept方法不重写的话,那么对boss对象的调用输出的结果是:
this is in employee visit
可见,虽然两个对象是不同的,但是如果boss对象调用父类的函数,而该函数中用到了this指针
那么结果很有可能是不对的,因为这里使用的this指针是employee类的。
博客围绕visitor设计模式展开,指出在该模式里,即便父类实现了accept方法,子类仍需重写。通过代码示例说明若子类不重写,使用父类含this指针的函数,可能导致结果错误,如boss对象调用时输出employee的结果。
244

被折叠的 条评论
为什么被折叠?



