所以我在尝试制作的一些类层次结构中出现了一些奇怪的行为。我正在实现图表,我正在通过制作一个将由 AdjacencyMatrixGraph 和 AdjacencyListGraph 实现的 Graph 类来做到这一点,因此它们可以被任何东西用作图表想要使用它们。
我在 Graph 中有一个纯虚函数,它被 AdjacencyMatrixGraph 中的函数覆盖,但是我有一个同名的非虚函数,但在 Graph 中有不同的签名。访问 AdjacencyMatrix 类时,我无法调用 Graph 类的非虚拟方法,但是当我重命名非虚拟方法时,它可以正常工作。
像这样:
当课程看起来像这样
class Graph
{
public:
virtual void addVertex(Vertex vert, bool bidirectional)=0;
void addVertex(unsigned int from, unsigned int to, double weight, bool bidirectional)
}
class AdjacencyMatrixGraph : public Graph
{
...
}
AdjacencyMatrixGraph test;
Vertex vert;
test.addVertex(vert,false); //this statement compiles and works fine
test.addVertex(0,0,10.f,false) //this statement fails to compile and says cadidates are addVertex(Vertex, bool)
但是,如果我像这样重命名非虚拟方法
class Graph
{
public:
virtual void addVertex(Vertex vert, bool bidirectional)=0;
void addVert(unsigned int from, unsigned int to, double weight, bool bidirectional)
}
AdjacencyMatrixGraph test;
Vertex vert;
test.addVertex(vert,false); //this statement compiles and works fine
test.addVert(0,0,10.f,false) //this statement compiles and works fine
这对我来说毫无意义,因为我认为编译器将 addVertex(Vertex, bool) 和 addVertex(unsigned int,unsigned int, double, bool) 视为两个完全不同的符号。所以一个不应该被继承覆盖,即使它不应该是可能的,因为符号采用不同的参数。