2017-04-10 16 views
-2

私は、このクラス構造を持っている:C++私のプロジェクトのためにベクトル基底クラスと継承

class Base 
{ 
     enum class type 
    { 
     Derived1, 
     Derived2 
    } 

    int getType() {return type;}; 

    type  type; 
    //general methods & attributes 
} 

class Derived1 : public Base 
{ 
    //specific methods & attributes 
    void  uniqueSpecificMethodOfDerived1(); 
} 

class Derived2 : public Base 
{ 
    //specific methods & attributes 
    void  uniqueSpecificMethodOfDerived2(); 
} 

class Core 
{ 
    vector<unique_ptr<Base>>  tab; 
    void       iterate(); 
} 

void  Core::iterate() 
{ 
    tab.emplace_back(new Derived1()); 
    tab.emplace_back(new Derived2()); 

    vector<unique_ptr<Base>>::iterator it; 

    for (it = tab.begin(); it != tab.end(); ++it) 
    { 
     if ((*it)->getType()) 
      (*it)->uniqueSpecificMethodOfDerived1(); //unknow function Can't resolve 'uniqueSpecificMethodOfDerived1()' 
     if ((*it)->getType()) 
      (*it)->uniqueSpecificMethodOfDerived2(); //unknow function Can't resolve 'uniqueSpecificMethodOfDerived1()' 
    } 
} 

私の問題は、私は、このベクトル内の派生クラスの特定のメソッドを達することができないです。そして、私はこの機能が完全に異なっており、他の派生クラスでは必要ではないため、多態性を使用したくありません。

どうすればいいですか?

+3

これらの機能が全く異なる場合、なぜこれらの異なるオブジェクトを同じベクターに埋め込みましたか? – Quentin

+1

あなたは、少なくとも 'dynamic_cast'を使ってポインタを正しい型にダウンキャストする必要があります。' Base'クラスは子供のメソッドについては何も知らないことが明らかです(仮想ではないので)これらの派生クラスは、メインクラスが提供する多くのメソッドと属性を共有しているため、実際の継承を継承しています - 継承の目的を捨てるようなやり方もあります。 – UnholySheep

+0

実際、彼らは同じタイプのオブジェクトです。エンティティは私の基底クラス、Enemy/Player/Shotはエンティティ –

答えて

1

私の問題は、このベクトルの派生クラスの具体的なメソッドに到達できないことです。そして、私はこの機能が完全に異なっており、他の派生クラスでは必要ではないため、多態性を使用したくありません。

どうすればいいですか?

この言語には、派生クラスの関数にアクセスするための2つのメカニズムがあり、基本クラスへのポインタ/参照があります。

  1. スルー多型。
  2. からdynmaic_castまで、派生したクラス関数に直接アクセスしてください。

あなたは明示的にdynamic_castを使用してクライアント・コードなしに、派生クラスの直接のインタフェースにアクセスすることを可能にする機能の層を構築することができますが、多型の使用はオプションではありませんならば、彼らはいくつかの点でdynamic_castを使用する必要があります。

ここには、dynamic_castを直接使用するコードの更新版があります。

class Base 
{ 
    public: 
     virtual ~Base() {} 
}; 

class Derived1 : public Base 
{ 
    public: 
     void uniqueSpecificMethodOfDerived1() {} 
}; 

class Derived2 : public Base 
{ 
    public: 
     void uniqueSpecificMethodOfDerived2(){} 
}; 

class Core 
{ 
    vector<unique_ptr<Base>>  tab; 
    void       iterate(); 
}; 

void Core::iterate() 
{ 
    tab.emplace_back(new Derived1()); 
    tab.emplace_back(new Derived2()); 

    vector<unique_ptr<Base>>::iterator it; 

    for (it = tab.begin(); it != tab.end(); ++it) 
    { 
     Base* ptr = (*it).get(); 
     Derived1* ptr1 = nullptr; 
     Derived2* ptr2 = nullptr; 
     if ((ptr1 = dynamic_cast<Derived1*>(ptr)) != nullptr) 
     { 
     ptr1->uniqueSpecificMethodOfDerived1(); 
     } 

     if ((ptr2 = dynamic_cast<Derived2*>(ptr)) != nullptr) 
     { 
     ptr2->uniqueSpecificMethodOfDerived2(); 
     } 
    } 
} 
関連する問題