1

抽象基本クラスを使用しているときに、オーバーロード比較演算子をどのように実行する必要があるかを理解するのに苦労しています。主な問題は、その基本クラスを使用してポリモーフィズムを実現することです。これは抽象的であるため、インスタンス化できないため、派生クラスのメソッドにアクセスするには、その基本クラスへのポインターを使用する必要があります。状況をよりよく説明するために、いくつかのコードを追加します。

template <typename _Tp>
class Base 
{
    private: 
       _Tp attr ; 
    public: 
       foo() = 0 ; 
       friend bool operator == ( Base* b1, Base* b2)  
       {
           return ( b1.attr == b2.attr ) ;
       }
}; 

template <typename _Tp> class Derived_1 : public Base<_Tp> { /.../ } ;
template <typename _Tp> class Derived_2 : public Base<_Tp> { /.../ } ; 

int main (void)
{
    vector<Base*<int> > * v = new vector<Base*<int> > (2,0) ; 
    v[0] = new Derived_1 () ; 
    v[1] = new Derived_2 () ; 
    if ( (*v)[0] == (*v)[1] ) { /.../ }
    return 0 ;
}

したがって、この時点で(*v)[0] == (*v)[1]、 のポインター比較であることがわかりますBase*。基本クラスで定義されているオーバーロードされた演算子は使用されないため、これら 2 つのポインター間の比較演算子をオーバーロードする方法があるかどうかを知りたいです。

応答後に編集:

私の実際のコードでは(*v)[0] == (*v)[1]、データ構造が一般性を失うため、オブジェクトを比較することはできません。したがって、私があなたに尋ねようとしているのはこれです:

Baseポインタの比較はできますか? どのように?

コンパイラから次のようなエラーが表示されます。

bool operator == (Base*,Base*) には、クラスまたは列挙型の引数が必要です。

4

3 に答える 3

2

基本クラスoperator==が呼び出されない理由は、行が

v[0] == v[1]

2 つのポインター (インデックス 0 とインデックス 1 のベクトルの内容) を比較します。

に変更すると*v[0] == *v[1]、比較に基本クラス演算子が使用されます。

ただし、多態的な設定でオーバーロードされた演算子を使用するのは困難です。詳細については、「Effective C++」で Scott Meyers の発言を参照してください。

于 2013-07-31T12:53:39.477 に答える