クラスのメンバーを知らなくても、基本クラスのインスタンスから派生したクラスのインスタンスを作成します。
-
23-09-2019 - |
質問
でも可能、このシナリオですか?
class Base
{
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
Derived(T* baseInstance);
};
目標:
Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);
pDerived-> someBaseMemerの値がpBase-> someBaseMemberにequeal及び他の基材と類似していなければならない。
解決
なぜあなたは実際にコードを書いてコンパイルし終えないでしょうか?
class Base
{
public: // add this
int someBaseMemer;
};
template<class T>
class Derived : public T
{
public: // add this
int someNonBaseMemer;
Derived(T* baseInstance)
: T(*baseInstance) // add this
{ return; } // add this
};
このコンパイルして実行し、指定した通ります。
EDIT:?それとも、someNonBaseMemer
を等しくなければならないことsomeBaseMemer
を意味しています。
他のヒント
なぜあなたは導出し、同時にベースポインタを渡したいのでしょうか?いずれかを選択し、何も両方を持っていることからあなたを停止しません。あなたのための仕事をするために使用継承ます:
class Base
{
public:
Base(int x) : someBaseMemer(x) {}
protected: // at least, otherwise, derived can't access this member
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
public:
Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
};
Derived<Base> d(42, 32); // usage
ではないが、デザインとして選択肢の最高ます。
宣言のパブリックとしてsomeBaseMemr
またはclass
にstruct
から宣言を変更します:
class Base
{
public:
int someBaseMemer;
};
OR
struct Base
{
int someBaseMemr;
};
class
は、デフォルトですべてのメンバーとメソッドへのprivate
のアクセス権を持っていることを覚えておいてください。 struct
は、デフォルトでpublic
のアクセスを提供します。
また、すべての派生クラスがpublic
からBase
継承を持っている必要があります。
所属していません StackOverflow