2

単純化した設計では、クラス B はクラス A をポリモーフィックに継承します。テンプレート化されたクラスにBase<T>は、以降のT*操作に使用されるメンバーがあります。Aは からポリモーフィックにDerived<T>継承されます。Base<T>この種のオブジェクトの作成を可能にする構文は次のとおりです。

Base<A>* a = new Derived<B>();

さらに参考までに、私が使用したコードは次のようになります (もちろん、変換は成功しません)。

class A
{
public:
  A()
  {
    cout<< " A  ";
  }
  virtual void one()
  {
    cout<<" 1 ";
  }

};

class B: public A
{
public:
  B()
  {
    cout << " B  ";
  }
  void one()

  {
      cout << " 2 ";
  }
};

template <class T>
class Base
{

public:
    T* thing;
  Base()
  {
    cout<<"Base";
    thing = new T;
  }
  template <class S>
  Base(Base<S>* obj)
  {
    thing = obj->thing;
  }
  virtual void poly(){ thing->one();}
};
template <class T>
class Derived : public Base<T>
{
public:
  Derived()
  {
    cout << "DERIVED ";
  }
  virtual void poly(){ 
};
int main(int argc, char** argv)
{
  //Base<A>* a = (new Derived<B>());
  return 0;
}

コードを簡潔にするために、仮想デストラクタと適切なメモリ管理は意図的に省略されています。

EDIT : この構築の唯一の目的は、たとえば、BaseTemplated<BasePolymorphic>*ポインターのリストをまとめて保持することであり、基本のポリモーフィック クラスのすべての N サブクラスに使用BaseTemplated<Derived1>することではありません。BaseTemplated<DerivedN>

4

3 に答える 3

4

まず、「単純化」の部分に到達したら教えてください。

テンプレートの半分をすべて剥がして、ポリモーフしようとしている部分だけに集中します)。最終的には、別個のクラスBase<A>Base<B>. (後者は の導出によるDerived<B>)。

これらはいずれも、それぞれのテンプレート パラメーターから継承されません。したがって、to の関係 (階層的またはその他)AB無関係です。Base<A>Base<B>は区別され、無関係であるため、書かれたままにしようとしていることは機能しません。実際、がそれぞれ aおよびから継承されたとしても、サンプルで使用していないポインタが期待できます。ABA*

本当に興味があるので、そうでない場合は喜んで削除します。

于 2013-01-12T10:44:23.593 に答える
3

果物の袋には桃、サクランボ、ナシを入れることができるので、リンゴBase<B>の袋は果物の袋ではありません.Base<A>

于 2013-01-12T10:49:30.940 に答える
1

これはポインタでは機能しません。の結果はnew Derived<B>に代入できません。実際、これらの型はすべて無関係であるため、Base<A>*に代入することさえできません。Derived<A>*テンプレート化されたラッパー間のこの関係が本当に必要ですか? (標準のスマート ポインターのように) Base<B>andの値の変換可能性を保証するだけで十分ではないでしょうか? Base<A>テンプレート化された変換コンストラクターで既にこれを持っています...

//...
Base<B> tB(new B);
Base<A> tA = tB;
//...
于 2013-01-12T11:07:33.597 に答える