爲什麼呼籲在下面的程序都B
和D
B::operator()
?爲什麼在模板中調用基類的運算符?
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
class B {
public:
virtual ~B() {}
virtual bool operator()(int a, int b) { return a < b; }
};
class D : public B {
public:
bool operator()(int a, int b) override { return a > b; }
};
void f(B& b, std::vector<int>& v)
{
std::sort(v.begin(), v.end(), b);
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
int main()
{
const std::vector<int> v{5, 3, 8, 1, 7};
std::vector<int> vb(v);
B b;
f(b, vb);
std::vector<int> vd(v);
D d;
f(d, vd);
return 0;
}
如果我改變std::sort(v.begin(), v.end(), b)
這樣:
std::sort(v.begin(), v.end(),
[&](int x, int y){ return b.operator()(x, y); });
然後向後f(d, vd)
種種預期。
我最好的理解是std::sort(v.begin(), v.end(), b)
使用&B::operator()
而不是b.operator()
。我無法找到一個明確的解釋,雖然,它似乎並不完全合乎邏輯的,因爲編譯器應該能夠看到B
有虛表。
'的std :: sort'由值取比較器。這裏真正的教訓是,非葉基類應該是抽象的,這將避免正是這種誤解。 –