Это моя ситуация:Ошибка при переопределении C++ виртуальная функция
class Filter3by3 {
public:
virtual inline Mat convolution((Mat & mat, int i, int j, int rows, int cols) {
code
}
};
class MySobel: public Filter3by3 {
public:
inline Vec3b convolution(Mat & mat, int i, int j, int rows, int cols) {
code
}
};
Теперь, когда я звоню: метод
Filter3by3 f = choose_filter(filtername); // Returns a Sobel filter
Mat mat;
s.convolution(args);
Базовый класс называется. Я довольно новичок в правилах привязки методов C++, так что вы можете сказать мне, где я ошибаюсь? Я ценю вашу помощь.
UPDATE Оказывается, что даже с виртуальной рядный Mat свертка ((Mat & мат, Int я, Int J, внутр строки, внутр смещ_по_столбцам) Это не работает.
Это работает программа, составленная с г ++ -std = C++ 11
#include <iostream>
using namespace std;
class Filter {
public:
Filter() { }
virtual int ehi() {
cout << "1" << endl;
return 1;
}
};
class SubFilter : public Filter {
public:
SubFilter() : Filter() { }
int ehi() {
cout << "2" << endl;
return 2;
}
};
Filter choose_filter(){
SubFilter f;
return f;
}
int main(int argc, char* argv[]) {
Filter f = choose_filter();
f.ehi();
return 0;
}
он печатает 1 вместо 2. Я использовал виртуальный для обеспечения динамического связывания, но это, кажется, не достаточно, а также с «переопределить» ключевое слово.
Чтобы переопределить функцию, она должна иметь точную подпись базового класса. Поскольку вы изменяете тип возвращаемого значения, вы не переопределяете функцию базового класса. Однако с кодом, который вы показываете, должна быть вызвана правильная функция. Это копия-вставка из вашего * фактического * кода? Не могли бы вы попытаться создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам. –
Что касается вашего редактирования, вы вызываете виртуальную функцию на 'f' или' s'? Что такое '' '? И если это действительно 'f', то вы, вероятно, должны читать о [* обрезке объектов *] (http://stackoverflow.com/questions/274626/what-is-object-slicing). –
Полиморфизм работает только с помощью указателей или ссылок на базовый класс. У вас есть нарезка объектов. –