0

私はC++で次のコードを持っています

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

class A{
  public:
    int x;
    int y;
    int first(){
      return x;
    }
    int second(){
      return y;
    }
};

class C{
  public:
    float a,b;
    C(){
      a = 0.0f;
      b = 0.0f;
    }
    template<class T>
      C(T t){
        cout<<"Copy Constructor\n";
        a = t.first();
        b = t.second();
      }
      template<class T>
    C & operator=(T const &c){
        cout <<"Assignment operator\n";
        this->a = c.first();
        this->b = c.first();
    }
};

class D: public C{
  public:
    template <typename T> D (T t) : C(t) {}
    float area(){
      return a*b; 
    }
};

int main(){
  A a;
  a.x = 6;
  a.y = 8;
  C c(a);
  D d(a);
  D e = a;   // Here copy constructor is being called!!
  cout<<e.a<<" "<<e.b<<" "<<e.area()<<endl;
}

上記のプログラムの出力は次のとおりです

Copy Constructor
Copy Constructor
Copy Constructor
6 8 48

派生クラスで代入演算子が呼び出されないのはなぜですか?

Edit1:質問をより明確にするために質問を変更しました。

4

2 に答える 2

2

コンストラクターは、通常のパブリック関数として継承されません。デフォルトのコンストラクターは、欠落している場合はコンパイラーによって定義されますが、 のAパラメーターを取る (または のようにテンプレート化されたC)コンストラクターを定義する必要がありますD。代入演算子も定義する必要があります。

class D: public C{
  public:
    D(A aparam)
    : a(aparam.first(), b(aparam.second()){
    }
    D& operator=(const D& rhs){
      a = rhs.first();
      b = rhs.second();
    }
    float area(){
      return a*b; 
    }
};
于 2012-06-21T06:32:58.667 に答える
0

次を使用して、前述の operator= を明示的に取得できます。

using C::operator=

Dクラスで。

operator= は継承されますが、ecompiler によって生成されたものによってデフォルトでマスクされます。

于 2012-06-21T07:05:43.330 に答える