У меня есть 2 классов: Child
происходит от Parent
:Неявное преобразование типов в указателях функций в C++?
#include <stdint.h>
#include <iostream>
using namespace std;
class Parent
{
public:
int parentMember;
};
class Child : public Parent
{
};
Теперь у меня есть шаблон класса для пользовательской реализации динамического массива (ненужные части пропущены)
template <typename T>
class DArray
{
private:
T* m_array;
int32_t m_length;
public:
// Default constructor
DArray() : m_array{ nullptr }, m_length{ 0 } {
};
// Search returns index of the first found item or -1 if not found, comparison is done
// using function pointer, which should return boolean
int32_t Search(const T& data, bool(*comparisonFunction)(T, T)) {
for (int32_t i = 0; i < m_length; i++) {
if (comparisonFunction(m_array[i], data))
return i;
}
return -1;
}
};
У меня есть функция сравнения , который будет использоваться, чтобы узнать, содержит ли мой динамический массив элемент с тем же значением parentMember
bool comparisonFunction(Parent* n1, Parent* n2) {
return (n1->parentMember == n2->parentMember);
}
Наконец, у меня есть мой динамический массив, который должен содержать указатели на объекты Child
.
int main()
{
DArray<Child*> dArray;
Child *c;
dArray.Search(c, comparisonFunction);
return 0;
}
Этот код возвращает ошибку на этой линии:
dArray.Search(c, comparisonFunction);
Ошибка является:
argument of type "bool (*)(Parent *n1, Parent *n2)" is incompatible with
parameter of type "bool (*)(Child *, Child *)"
Мой вопрос: Почему не компилятор неявно преобразовать Child*
в Parent*
как это когда я передаю Child*
в качестве аргумента функции, которая принимает параметр Parent*
в качестве параметра?
Есть ли способ решить эту проблему без реализации новой функции сравнения для каждого дочернего класса?
какой-либо причине вы не используете ' std :: vector' и ''? –
@appleapple Я все еще изучаю C++, и я хочу понять, как это работает «за занавеской» :) – Riko
Лучше всего понять, как это сделать в первую очередь. –