前两天看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类的。