1

クラスCを継承するクラスがありますP

template <typename T>
class P{
  public:
  P();
  P(T* sometype);
};

class C: public P<sometype>{

};

コンストラクターをC非表示にしますか?P(sometype*)しかし、そのP(ometype*)コンストラクターが で利用可能である必要がありますCC(sometype*)親コンストラクターを呼び出す別のコードを作成する必要がありますか? または簡単なブレークスルーがあります。C++11機能を使用したくありません。

4

4 に答える 4

3

はい、コンストラクターは継承されません。のために新しいものを書く必要がありますC:

template <typename T>
class C : public P<T> {
public:
  C(T* sometype) { /*...*/ }
};

さらに、識別子の使用にsometypeは一貫性がないことに注意してください。P変数名として使用する場合、Cそれは型名ですが、宣言されていません。

もう 1 つの問題は、コンストラクターがCオブジェクトに対して何をするかというsometypeことです。のコンストラクターが行うこととまったく同じことを行うと思われPます。とにかく基本クラスのコンストラクターを呼び出す必要があるため、コンストラクターの実装は次のCようになります。

template <typename T>
class C : public P<T> {
public:
  C(T* sometype):P<T>(sometype) { }
};

最後の発言として、C++11 は実際には機能としてコンストラクターの継承を提供します。あなたは C++11 機能の使用に興味がないので (これは残念ですが)、この機能はまだ多くのコンパイラで実装されていないため、詳細には触れません。機能定義への参照はここにあります。

于 2012-08-20T11:32:28.493 に答える
1

sub-typeで基本クラス を指定する必要がある場合は、次のようにtype Tしてください。

template<typename T>
class C : public P<T> {
  public:
    C(T* pT): P(pT) {}
}

int* pMyInt;
C<int> myClass(mMyInt);
于 2012-08-20T11:30:12.833 に答える
0

次のように、同じパラメーターを取り、それを親クラスに渡す C のコンストラクターを作成する必要があります。

C(T* sometype)
    : P(sometype)
{
}
于 2012-08-20T11:30:24.853 に答える
0

C は P(sometype*) コンストラクターを非表示にしますか?

はい、CP のコンストラクターを継承しないという意味で。そのCため、クラスのユーザーは親クラスのコンストラクターを使用できません。

しかし、P(ometype*) コンストラクターを C で使用できるようにする必要があります

それは可能です:あなたはそれを直接呼び出すだけです:

P::P(sometype*)
于 2012-08-20T11:32:28.767 に答える