0

私はこの質問に対する具体的な答えを広範囲に検索しましたが、それを見つけることができません。派生クラスでオーバーライドできる仮想演算子>を使用して基本クラスを作成しようとしています。関数の宣言には(「booloperator>(Derived&a)」のように)1つの入力変数しか必要ないため、現在問題が発生していますが、cppファイルで定義しようとすると(「booloperator」のように)2つの入力が必要であることがわかります。 >(Derived&a、Derived&b))

演算子をインラインで定義しようとしましたが、基本クラスではなく、上記のように派生型を演算子に渡したため、派生クラスがまだ抽象的であると見なされるエラーが発生します。しかし、基本クラスを渡すと、比較を行うために必要な派生メンバー変数にアクセスできなくなります。

ここでは単純なものが欠けていると思いますが、それが何であるか理解できないようです。

うまくいけば、あなたが助けることができます。ありがとう

4

3 に答える 3

0
#include <iostream>
using namespace std;
class base{
public :
        virtual bool operator> (base& obj) { cout<<"b\n";return true;}
        virtual ~base(){}
};

class derived: public base{
public:
        virtual bool operator> (derived& obj) { cout<<"d\n";return true;}
        ~derived(){}
};

int main()
{

base *a=new derived(),b;
if(*a>b) { delete a; cout<<"Done!\n"; }

return 0;
}
于 2013-01-12T00:31:08.543 に答える
0

ベースの参照/ポインターから仮想呼び出しを機能させるには、関数でベース型を使用する必要があります。たとえば、

class Derived : public Base
{
    .... 
    bool operator>(Base &a)
    {
         Derived *pa = dynamic_cast<Derived *>(&a);
         return this->something > pa->something;   // Or whatever... 
    }

   .... 
};

型を変えると別の関数になり、基本ポインタやリファレンスを使ってoperator>を参照すると、基本クラスのものを使うようになります。

于 2013-01-11T23:09:35.023 に答える
0

operator>()非仮想をそのままにして、プライベート仮想関数を呼び出させてみませんか?

そのようです:

class Base {
public:
    bool operator>(Base &a) {
        return implementingFunction(a);
    }

private:
    virtual bool implementingFunction(Base &a) = 0;
};
于 2013-01-11T23:13:06.743 に答える