Поэтому я получаю странное поведение с некоторой иерархией классов, которую пытаюсь создать. Я реализую графы, и я делаю это, создавая класс Graph, который будет реализован в AdjacencyMatrixGraph и AdjacencyListGraph, чтобы они могли быть использованы в качестве Graph любым что хотел их использовать.
У меня есть одна чисто виртуальная функция в Graph, которая перезаписывается функцией в AdjacencyMatrixGraph, однако у меня есть не виртуальная функция с тем же именем, но другой подписью в Graph. Я не могу вызвать не виртуальный метод класса Graph при доступе к классу AdjacencyMatrix, но когда я переименую не виртуальный метод, он работает нормально.
Как это:
Когда классы выглядят так
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) как два совершенно разных символа. Так что нельзя наследовать наследованием, даже если бы это было невозможно, потому что символы принимают разные аргументы.
Определение в производном классе шкуры объявления перегрузки базового класса.
Чтобы перенести их в область производного класса, используйте using
декларация, как
using Graph::addVertex;
в производном классе.
Кстати, это Часто задаваемые вопросы. Это часто хорошая идея, чтобы проверить FAQ, прежде чем спрашивать. Или даже просто в общем. 🙂
В этом случае 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");
}