3

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

3 回答 3

3

您必须声明多态函数virtual。否则你不会得到多态行为

virtual bool cmp (T & a, T & b)
于 2012-08-03T09:27:59.470 回答
2

您的cmp函数必须virtualA.

protected:
    virtual bool cmp (T & a, T & b)
    {
        return a > b;
    }

它将在派生类中隐含地保持虚拟,尽管为了清楚起见,我也会显式声明cmp虚拟。B

于 2012-08-03T09:29:19.053 回答
1

您应该cmp在基类中创建一个虚函数:

virtual bool cmp (T & a, T & b);
于 2012-08-03T09:29:37.090 回答