這是我的情況:錯誤時,重載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)。 –
多態僅適用於使用指針或對基類的引用。你有對象切片。 –