2016-03-21 6 views
0

私は以下の(単純化された)C++コードを持っています。 ABCC++は別のクラスで型として使用されているクラスを継承します

class A 
{ 

}; 

class B 
{ 
    public: 
     A addSomething(int something) 
     { 
      this->something = something; 
     } 

    private: 
     int something; 
}; 

class C : public A 
{ 

}; 

void main() 
{ 
    B variableB = B(); 

    A variableA; 
    variableA = variableB.addSomething(123); 

    C variableC; 
    variableC = variableB.addSomething(456); 
} 

私は3つのクラスがあります。 Bはマスタークラスまたはメインクラスとみなされ、CおよびAは私のコンテキストでサブクラスを表します。 クラスBには、型がAでなければならないパブリックメソッドがあり、そのプライベートプロパティに整数値を追加します。クラスCはクラスAを拡張します。

メイン関数では、マスタークラスがインスタンス化され、そのインスタンスが整数値を追加するために使用されます。これは正常に機能します。 しかし、クラスAから派生したインスタンスで同じことをすることはできません。

なし演算子は「=」私はマスタークラスにaddSomething関数がクラスの型を持っていることに起因していることを認識していますこれらのオペランドに

に一致するA:それはというエラーを返します。しかし、私はそれもその子クラスで動作する必要があります。 クラスBを変更せずに動作させる方法はありますか?

+0

あなたは[*について読んオブジェクト・スライシング*](http://stackoverflow.com/questions/274626/what-is-object-slicing)にする必要があります。 –

+1

Cの型の変数にCのインスタンスを代入することはできません.BはC型のインスタンスを返すことができますが、A型とCの変数に代入することができます。 – Harry

+1

'B :: addSomething() 'はあなたの例では何も返しません。それは新しいAまたはCを構築するか、それはどのように動作するはずですか? – LiMuBei

答えて

2

あなたの目標を約ないC型値にA型値を与えることですBさんのお仕事。あなたがする必要があるのは、クラスCのコンストラクタ関数を記述し、値をvariableCに与えることです。

だから、クラスCのためのコードを追加します。

class C : public A 
{ 
    public: 
     C() {} 
     C(A a){} 
}; 
1

AのインスタンスをCの変数に割り当てる方法はコンパイラが分かりません。

あなたはクラスBを変更傾ける場合、あなたはクラスCoperator=を実現することができます。

class C : public A 
{ 
public: 
    C& operator=(const A& a) 
    { 
     // assign A to C 
     return *this; 
    } 
}; 
関連する問題