2011-01-19 15 views
25

次のパターンはok/safeですか?あるいは何か欠点はありますか? (私も等価演算子のためにそれを使用)基本クラスの呼び出し演算子...安全?

Derived& operator=(const Derived& rhs) 
{ 
    static_cast<Base&>(*this) = rhs; 
    // ... copy member variables of Derived 
    return *this; 
} 

答えて

38

これは結構ですが、それは名前で基本クラスを呼び出すためにたくさんより読み私見です:

Base::operator = (rhs); 
+0

確かに...ちょうどそのキャストする必要が、実際にこれは良い方法である – smerlin

12

はい、それは安全です。同じことを行うには

別の構文は次のようになります。

Base::operator=(rhs); 
+0

(常にそれだけで明示的に定義されたもののために働くだろうと思った)この表記は、暗黙的に定義されたassignement事業者のaswellのために働くことに気づきました。また、これは派生クラスで行う必要があります –

1

あなたのベースクラスはstatic_castをが許可されていない純粋な仮想メソッドを持っているので、場合

Base::operator=(rhs); 

を使用することをお勧めしますこと。

class Base { 
    // Attribute 
    public: 
     virtual void f() = 0; 
    protected: 
     Base& operator(const Base&); 
} 

class Derived { 
    public: 
     virtual void f() {}; 
     Derived& operator=(const Derived& src) { 
      Base::operator=(src); // work 
      static_cast<Base&>(*this) = src; // didn't work 
     } 
} 
関連する問題