2016-07-20 6 views
1

私は2つのクラス、抽象クラスを持っているとしましょう。クラス階層の制約付きコンストラクタ、C++

class A { 
//code... 
}; 
class B { 
public: 
    B(A *x); 
}; 

そして、次のように私は両方のクラスを拡張:

class A1 : public A { 
}; 
class A2 : public A { 
}; 

class B1 : public B { 
public: 
    B1(A1 *x); 
}; 
class B2 : public B { 
    B2(A2 *x); 
}; 

これはB2は必ずしもB1オブジェクトの権利を必要とする一方で、唯一A1使用B1オブジェクトをインスタンス化することができることを意味?たとえば、B1をインスタンス化するためにA2を使用して、事を混在させることはできません。これは、クラスA,Bが抄録であるためです。 A,Bが抽象でない場合はどうですか?それは何か変わるのですか?

+3

「B2」は、「A2」へのポインタを必要とします。 – Bathsheba

+0

'A *'をパラメータとして使うことができます。次に 'A1'または' A2'を使ってそれらを構築することができます。 – songyuanyao

+1

B1はA2でインスタンス化できますか?なぜA2で、Foo、Bar、int(int)、std :: stringではないのですか? –

答えて

1

A、Bが抽象でない場合はどうなりますか?それは何か変わるのですか?

いいえ。これの主な影響は、ユーザーがAを直接構築できることです。 Bのコンストラクタがpublicであれば、そのAオブジェクトからBをインスタンス化することもできます。

B1またはB2のいずれかをインスタンス化することはできません。A。コンストラクタはそれぞれAのサブクラスであるA1とをとるため、AまたはAの間違ったサブクラスからインスタンス化することはできません。

0

これは、B1オブジェクトは唯一のA1

並べ替えを使用してインスタンス化することができることを意味します。彼らはA1ポインターをコンストラクターに渡す必要がありますが、A1というインスタンスは必要ありません。単純にnullptrを渡すことができるからです。

B2は必ずB1オブジェクトが必要ですが、 A2B1を必要B2

号はA2を継承しません。

ここでは例を挙げてB1をインスタンス化するためにA2を使用しています。

確かにチャンスはありません。 A2*A1*に変換できません。

これは、クラスA、Bが抄録であるためです。 A、Bが抽象的でない場合はどうですか?

抽象で​​あるかどうかはB1A2でインスタンス化できるかどうかに影響しません。

関連する問題