C ++模板和继承,函数未在派生类中替换

时间:2012-08-03 09:26:45

标签: c++ templates inheritance

这里我附上了一个最小的案例,其中在子类中,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;
}

3 个答案:

答案 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);
相关问题