函数指针指向不同类的方法

时间:2017-01-04 13:17:24

标签: c++ class

我有一个图表类Pqueue1和两个Pqueue2Pqueuei(Graph &g)个优先级队列。两个优先级队列都具有i形式的构造函数,其中1 = 2Dijkstra,并且它们都具有方法void Dijkstra(Node*),其形式为:{ {1}}。最短路径树写入g

现在我想编写一个函数来构造两种类型的优先级队列,具体取决于某些条件(g的密度),然后调用相关的Dijkstra方法。

如何做到这一点?

我想到了一个函数指针dijk,但由于两者都是类的方法,我需要以不同方式调用它们,pq1.*dijkpq2.*dijk(其中pq1是一个Pqueue1等类型的对象。但是,我必须提前构建两个优先级队列,这是次优的。

1 个答案:

答案 0 :(得分:0)

有两种常见的方法:运行时多态性和编译时多态性。

对于运行时多态性,使用虚函数定义基类:

class queue_base {
public:
    virtual void Dijkstra(Node*) = 0;
};

然后从中派生每个队列类:

class Pqueue1 : public queue_base {
public:
    void Dijkstra(Node*);
};

,同样适用于Pqueue2

现在可以通过指向基类型的指针来解决这些类型的对象:

Pqueue1 q1;
Pqueue2 q2;
queue_base* qp = &q1;
qp->Dijkstra();
qp = &q2;
qp->Dijkstra();

对于编译时多态,请编写模板函数:

template <class Q>
void do_dijkstra(Q& q, Node* n) {
    q.Dijkstra(n);
}

您可以使用任何类型的对象调用此函数,该对象具有名为Dijkstra的函数,该函数接受Node*类型的一个参数:

Pqueue1 q1;
Node node;
do_dijkstra(q1, &node);
Pqueue2 q2;
do_dijkstra(q2, &node);