1

所以我在尝试制作的一些类层次结构中出现了一些奇怪的行为。我正在实现图表,我正在通过制作一个将由 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) 视为两个完全不同的符号。所以一个不应该被继承覆盖,即使它不应该是可能的,因为符号采用不同的参数。

4

2 回答 2

4

派生类中的定义隐藏了基类重载声明。

要将它们带入派生类的范围,请使用using声明,例如

using Graph::addVertex;

在派生类中。

顺便说一句,这是一个常见问题解答。在询问之前检查常见问题解答通常是个好主意。甚至只是一般情况下。:-)

于 2012-11-20T04:18:57.757 回答
1

在这种情况下AdjacencyMatrixGraph隐藏Graph::addVertex(unsigned int from, unsigned int to, double weight, bool bidirectional). 要将函数带入范围使用using声明,如下所示:

class A
{
public:
virtual void foo(int) = 0;
virtual void foo(std::string) { std::cout << "foo(string)" << std::endl; }
};

class B : public A
{
public:
using A::foo; //this unhides A::foo(std::string)
virtual void foo(int) { std::cout << "foo(int)" << std::endl; }
};

int main()
{
B b;
b.foo(1);
b.foo("hello");
}
于 2012-11-20T05:23:58.123 回答