single dispatch

​ 简单说就是一次虚函数调用

double dispatch

​ 简单说就是两次虚函数调用

为什么要double dispatch

#include <iostream>
#include <typeinfo>
using namespace std;
class Dog;
class Cat;
class Animal {
public:
    virtual void hit(Animal& animal) = 0;
    virtual void hit(Dog& dog) = 0;
    virtual void hit(Cat& cat) = 0;
};
class Dog :public Animal {
    void hit(Animal& animal) override {
        animal.hit(*this);
    }
    void hit(Dog& dog) override {
        cout << "dog hit dog" << endl;
    }
    void hit(Cat& dog) override {
        cout << "dog hit cat" << endl;
    }
};
class Cat :public Animal {
    void hit(Animal& animal) override {
        animal.hit(*this);
    }
    void hit(Dog& dog) {
        cout << "cat hit dog" << endl;
    }
    void hit(Cat& cat) {
        cout << "cat hit cat" << endl;
    }
};
void test1(Animal& cat, Animal& dog) {
    cat.hit(dog); // dog hit cat
}

从编译器看,第一次调用虚函数hit_Animal, 第二次调用虚函数hit_Cat,加上运行时的话,调用的是:

Cat::hit_Animal, Dog::hit_Cat,我以为这样解释方便理解一些。只有double dispatch才能最终调用到Dog::hit_Cat;

visitor parrent:

#include <iostream>
#include <typeinfo>
using namespace std;
class Animal;
class Dog;
class Cat;
class Visitor {
public:
    virtual void hit(Dog& dog) = 0;
    virtual void hit(Cat& cat) = 0;
};
class Animal {
public:
    virtual void accept(Visitor& visitor) = 0;
};
class Dog :public Animal {
public:
    void accept(Visitor& visitor) override {
        visitor.hit(*this);
    }
};
class Cat :public Animal {
public:
    void accept(Visitor& visitor) override {
        visitor.hit(*this);
    }
};
class Visitor1:public Visitor {
public:
    void hit(Dog& dog) override {
        cout << "dog hit dog" << endl;
    }
    void hit(Cat& cat) override {
        cout << "dog hit cat" << endl;
    }
};
void test1(Animal& cat, Animal& dog) {
    Visitor1 v;
    cat.accept(v); // dog hit cat
}

visitor 用于代表动作,

虚函数调用顺序是Cat::accept_Visitor, Visitor1::hit_Cat

上面例子也反映出,如果参数传入函数可能发生了自动类型转换, 以及函数重载解决策略。

最后修改:2019 年 03 月 06 日
如果觉得我的文章对你有用,请随意赞赏