class A { };c++
class AA : public A {}设计模式
class B {函数
public: this
void fun(A& a) {}spa
void fun(AA& a1) {}.net
};设计
int main(void)指针
{对象
A* a = new A;blog
A* a1 = new AA;
AA* aa = new AA;
B b;
b.fun(*a); // 会调用 void fun(A& a) {}
b.fun(*a1); // 会调用 void fun(A& a) {} 这就是单dispatch,没法识别a1真正的类型,c++不支持double dispathc
b.fun(*aa); // 会调用 void fun(AA& a) {} // aa是AA类的实例。
}
举例: 对vector<A *>排序, 每一个A子类对象都要实现compare函数,用于this和另外一个对象的比较
class A {
public:
virtual bool compare(A* a) = 0;
}
此时, 每一个子类的compare函数里都须要switch case来判断到底和哪一种子类对象进行比较,这就是一种Double Dispatch。
改进:使用子类重载来消除switch case,父类也须要改进。
class A {
public:
bool compare(A* a) { a->compare(*this); } // *this取得了子类对象 动态多态
virtual
}
class A1 : public A {
public:
virtual bool compare(A2& a) { ,,. } // 静态多态
}
class A2 : public A {
public:
virtual bool compare(A1& a) { ,,. } // 静态多态
}
这里假设只有A1和A2两个子类,若是再加一个子类A3,则A1 A2子类中都要增长一个compare函数virtual bool compare(A3& a) ,用于和新增对象的比较。这也是visitor模式最主要的缺点
参考:
http://blog.csdn.net/seizef/article/details/5332297
http://blog.163.com/very_fyy/blog/static/22521685201063044030549/