1. ホーム
  2. c++

[解決済み] C++で基底クラスのコンストラクタと代入演算子を使うには?

2022-12-18 07:40:48

質問

私は、クラス B というクラスがあり、コンストラクタと代入演算子があります。

これです。

class B
{
 public:
  B();
  B(const string& s);
  B(const B& b) { (*this) = b; }
  B& operator=(const B & b);

 private:
  virtual void foo();
  // and other private member variables and functions
};

継承するクラスを作りたい D をオーバーライドする foo() を上書きするだけで、他の変更は必要ありません。

しかし、私は D と同じようにコピーコンストラクタと代入演算子を含むコンストラクタのセットを持ちたいのです。 B :

D(const D& d) { (*this) = d; }
D& operator=(const D& d);

で全部書き換えないといけないのでしょうか? D に書き直さなければならないのでしょうか? B のコンストラクタと演算子を使う方法はありますか?特に代入演算子の書き換えは避けたいと考えています。 B のプライベートメンバー変数にアクセスしなければならないからです。

どのように解決するのですか?

コンストラクタや代入演算子を明示的に呼び出すことができます。

class Base {
//...
public:
    Base(const Base&) { /*...*/ }
    Base& operator=(const Base&) { /*...*/ }
};

class Derived : public Base
{
    int additional_;
public:
    Derived(const Derived& d)
        : Base(d) // dispatch to base copy constructor
        , additional_(d.additional_)
    {
    }

    Derived& operator=(const Derived& d)
    {
        Base::operator=(d);
        additional_ = d.additional_;
        return *this;
    }
};

面白いのは、これらの関数を明示的に定義していなくても動作することです(その場合、コンパイラが生成した関数を使用します)。

class ImplicitBase { 
    int value_; 
    // No operator=() defined
};

class Derived : public ImplicitBase {
    const char* name_;
public:
    Derived& operator=(const Derived& d)
    {
         ImplicitBase::operator=(d); // Call compiler generated operator=
         name_ = strdup(d.name_);
         return *this;
    }
};