这里我附上了一个最小的案例,其中在子类中,cmp
将替换父类中的一个,但它不起作用,它总是从父类调用一个
#include <iostream>
template <typename T>
class A
{
public:
void tell(T a, T b)
{
std::cout << (cmp (a, b) ? a : b) << " is better" << std::endl;
}
protected:
bool cmp (T & a, T & b)
{
return a > b;
}
};
template <typename T>
class B: public A<T>
{
protected:
bool cmp (T & a, T & b)
{
return a < b;
}
};
int main ( int argc , char **argv )
{
B<int> b;
// should be: 3 is better here
b.tell(5, 3);
return 0;
}
答案 0 :(得分:3)
您必须声明多态函数virtual
。否则你将无法获得多态行为
virtual bool cmp (T & a, T & b)
答案 1 :(得分:2)
您的cmp
函数必须在virtual
中声明为A
。
protected:
virtual bool cmp (T & a, T & b)
{
return a > b;
}
它会在派生类中隐式保持虚拟,但为了清楚起见,我也明确地在cmp
中声明B
虚拟。
答案 2 :(得分:1)
你应该在基类中使cmp
为虚函数:
virtual bool cmp (T & a, T & b);