Что я вижу из вашего базового класса Element
, так это то, что это абстрактный тип, поскольку хотя бы один из его методов объявлен как purely virtual
. Это означает две вещи: во-первых, вы не можете создать объект типа Element
, а во-вторых, все унаследованные классы должны реализовывать любые функции, объявленные как pure virtual
.
В вашем базовом классе у вас есть это в качестве своей декларации:
virtual float distance(Element const&, Element const&)=0;
и в производном классе у вас есть это в качестве своей декларации:
float distance(Vector const&, Vector const&);//(?)
и в реализации производного класса у вас есть это :
float Vector::distance(Element const &a, Element const &b) {
return Vector::L2D(a,b);//Euclidean distance
}
Базовый класс заявляет, что эта чистая виртуальная функция tha t весь производный класс должен реализовать, должен возвращать float и должен принимать две ссылки const на тип элемента. Однако в вашем унаследованном классе в его декларации указывается иначе: он заявляет, что эта функция возвращает значение float, которое не является проблемой, но его типы параметров - это то, что объявляется как взятие двух ссылок на константу типа Vector. Если вы используете MS Visual Studio 2012 или более поздней версии, вы можете попробовать сделать это: добавить ключевое слово override
после объявления функции в унаследованной классе, так что ваша унаследовали декларация будет выглядеть следующим образом:
float distance(Vector const&, Vector const&) override;
Затем попробуйте скомпилировать и см., если вы получаете какие-либо ошибки компилятора, сборки или ссылки.
Следующим шагом было бы изменить декларацию и определение производного класса в соответствии с объявлением базового класса чистой виртуальной подписи. После этого ваше объявление производной функции будет выглядеть так:
float distance(Element const&, Element const&) override;
Чтобы понять это, что здесь происходит; вот пример того, что я сделал с вашим исходным кодом, чтобы вы могли видеть, что происходит с абстрактными типами и наследованием.
Element.h
#ifndef ELEMENT_H
#define ELEMENT_H
class Element {
public:
virtual float distance(Element const&, Element const& ) = 0;
}; // Element
#endif // ELEMENT_H
Element.каст
#include "stdafx.h"
#include "Element.h"
// ----------------------------------------------------------------------------
// distance()
float Element::distance(Element const&, Element const&) {
return 0;
} // distance
vector.h
#ifndef VECTOR_H
#define VECTOR_H
#include "Element.h"
class Vector : public Element {
public:
float distance(Element const&, Element const&) override;
}; // Vector
#endif // VECTOR_H
Vector.cpp
#include "stdafx.h"
#include "Vector.h"
// ----------------------------------------------------------------------------
// distance()
float Vector::distance(Element const&, Element const&) {
return 1;
} // distance
main.cpp
#include "stdafx.h"
#include "Vector.h"
int main() {
float val = 0;
Vector v1;
Vector v2;
Vector v3;
val = v3.distance(v1, v2);
std::cout << val << std::endl;
std::cout << "Press any key to quit" << std::endl;
_getch();
return 0;
} // main
Трудно точно сказать, что вы спрашиваете и чего вы пытаетесь достичь, но, глядя на ваш код, кажется, вы используете абстрактный тип с использованием наследования, но ваша унаследованная функция-функция является неправильной, поскольку он не соответствует сигнатуре чистого виртуального метода базы.
Если вы внимательно посмотрите на небольшую программу, которую я вам представил; это компилирует, строит и выполняет, и я получаю соответствующие результаты.
Если вы заметили здесь, декларация ожидает два const&
в типе Element
объекта, но когда я вызываю метод, который я передаю в двух объявлены переменные типов или экземпляров Vector
объекта. Это работает, потому что объекты Vector
наследуются от типа Element
. Также, если вы посмотрите на выходное значение, напечатанное значение равно 1, а не 0. Это то, что вы хотите, когда вы пытаетесь сделать override
объявление функции базового класса.
Element::distance()
возвращает 0 - Это не может быть названы, поскольку она является чисто виртуальный метод вызывает базовый класс абстрактным
Vector::distance()
возвращается 1 - Это будет называться на векторном объекте.
Возможно, это поможет вам достичь того, что вам нужно.
Детские классы не пишут методы, они реализуют их. Почему метод расстояния принимает два объекта? Я бы ожидал, что это займет один или будет статичным. – user463035818
и кстати вопрос не совсем понятен (по крайней мере мне). Как вы можете что-то сделать? Вы не найдете пример какой проблемы? Я не вижу никаких проблем. – user463035818
Я думаю, что теперь я медленно начинаю понимать, в чем вопрос ... – user463035818