2017-04-10 42 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

因爲這些派生類共享主類給出的許多方法和屬性。真的,他們是同一類型的對象。 Entity是我的基類,Enemy/Player/Shot是派生類Entity –

回答

1

我的問題是我無法達到此向量中派生類的具體方法。我不想使用多態,因爲這個函數是完全不同的,而其他派生類不需要。

我該怎麼做?

該語言提供了兩種機制來訪問給定基類的指針/引用的派生類中的函數。

  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(); 
     } 
    } 
}