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はで宣言する必要がありvirtualますA

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 に答える