这是我的情况:错误时,重载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 看来,即使 虚拟串列式垫卷积((垫&垫,INT I,诠释J,诠释行,诠释的cols) 它不工作。
这是一个运行程序,编译克++ -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,我使用的虚拟确保动态结合,但是它似乎没有足够,也与“覆盖”关键字。
要覆盖某个函数,它需要具有基类的确切签名。由于您更改了返回类型,因此您不会覆盖基类功能。然而,用你显示的代码应该调用正确的函数。是来自* actual *代码的复制粘贴吗?你可以请尝试创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示。 –
关于你的编辑,你是在'f'还是's'上调用虚函数?什么是's'?如果它真的是'f',那么你应该阅读[* object slicing *](http://stackoverflow.com/questions/274626/what-is-object-slicing)。 –
多态仅适用于使用指针或对基类的引用。你有对象切片。 –