【发布时间】:2021-10-15 13:56:17
【问题描述】:
考虑以下类:
class VisitableNode {
public:
virtual void Visit();
};
class VisitableGraph {
public:
virtual void Visit();
};
class OtherNode {
};
class OtherGraph {
};
template<class G, class N>
class GraphNode : public G, public N {
};
class MyVisitableGraph : public GraphNode<VisitableGraph, VisitableNode> {
};
class MyOtherGraph : public GraphNode<OtherGraph, OtherNode> {
};
MyVisitableGraph visitableGraph;
visitableGraph.Visit(); // Ambiguous access. Could be either VisitableGraph::Visit or VisitableNode::Visit.
MyOtherGraph otherGraph;
不明确的访问问题可以通过using里面MyVisitableGraph来解决:
class MyVisitableGraph : public GraphNode<VisitableGraph, VisitableNode> {
using VisitableGraph::Visit;
};
但是,有没有办法解决 GraphNode 内部的歧义?我不能只做using G:Visit,因为那时MyOtherGraph 不会编译。例如,是否可以指定默认情况下 G 的优先级应高于 N 以解决 GraphNode 中的歧义?
【问题讨论】:
-
您遗漏了一些
;并且该方法是私有的。 -
确实!谢谢:)
-
我不完全理解这个问题。
visitableGraph.Visit();应该总是打电话给VisitableGraph::Visit()吗?什么时候应该调用VisitableNode::Visit()? -
@463035818_is_not_a_number
visitableGraph是MyVisitableGraph类型,它继承自GraphNode,它继承自VisitableGraph和VisitableNode。VisitableGraph和VisitableNode都有一个Visit成员函数。因此模棱两可。 -
是的,有歧义,但你说你不想要使用,因为这样只能调用一种方法。你想什么时候给对方打电话?无论如何,看看答案,我希望这就是你要找的
标签: c++ templates multiple-inheritance