クラスのメンバーを知らなくても、基本クラスのインスタンスから派生したクラスのインスタンスを作成します。

StackOverflow https://stackoverflow.com/questions/2344910

質問

でも可能、このシナリオですか?

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またはclassstructから宣言を変更します:

class Base
{
  public:
  int someBaseMemer;
};

OR

struct Base
{
  int someBaseMemr;
};
classは、デフォルトですべてのメンバーとメソッドへのprivateのアクセス権を持っていることを覚えておいてください。 structは、デフォルトでpublicのアクセスを提供します。

また、すべての派生クラスがpublicからBase継承を持っている必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top