Странное поведение с наследованием и переполнением стека

Поэтому я получаю странное поведение с некоторой иерархией классов, которую пытаюсь создать. Я реализую графы, и я делаю это, создавая класс 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) как два совершенно разных символа. Так что нельзя наследовать наследованием, даже если бы это было невозможно, потому что символы принимают разные аргументы.

1

Решение

Определение в производном классе шкуры объявления перегрузки базового класса.

Чтобы перенести их в область производного класса, используйте using декларация, как

using Graph::addVertex;

в производном классе.

Кстати, это Часто задаваемые вопросы. Это часто хорошая идея, чтобы проверить FAQ, прежде чем спрашивать. Или даже просто в общем. 🙂

4

Другие решения

В этом случае 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");
}
1

По вопросам рекламы [email protected]