2016-03-18 60 views
1

EDIT轉換到的獨特的基類的指針的載體

按照要求,我提供一個例子:

#include <iostream> 
#include <vector> 
#include <memory> 

using namespace std; 

class Animal 
{ 
    public: 
     virtual void printName() = 0; 
}; 

class Dog: public Animal 
{ 
    public: 
     virtual void printName() { cout << "Dog" << endl; } 
}; 

class Cat: public Animal 
{ 
    public: 
     virtual void printName() { cout << "Cat" << endl; } 
}; 

int main() 
{ 
    vector<vector<unique_ptr<Animal>> *> groups_of_animals; 

    vector<unique_ptr<Dog>> dogs; 
    vector<unique_ptr<Cat>> cats; 

    dogs.push_back(unique_ptr<Dog>(new Dog)); 
    dogs.push_back(unique_ptr<Dog>(new Dog)); 
    cats.push_back(unique_ptr<Cat>(new Cat)); 

    groups_of_animals.push_back(reinterpret_cast<vector<unique_ptr<Animal>> *>(&dogs)); 
    groups_of_animals.push_back(reinterpret_cast<vector<unique_ptr<Animal>> *>(&cats)); 

    for(auto &group: groups_of_animals) 
     for(auto &animal: *group) 
      (animal) -> printName(); 

    return 0; 
} 

輸出:狗狗貓

是使用重新解釋鑄這裏安全和合理嗎?靜態轉換不起作用。

PS我發現這個話題:I want a vector of derived class pointers as base class pointers但在我的情況我使用的unique_ptr和希望,我不想因爲我更新一些的孩子矢量儘快更新大家載體。我只想指向那些子載體。

+1

也許顯示一個示例輸入和輸出,因爲我不明白你寫的問題。 – erip

回答

3

您不能這麼做,原因很簡單,reinterpret_caststatic_cast也不是dynamic_cast這樣工作。

當你有一個:

class Superclass {}; 

class Subclass : public Superclass {}; 

你可以在某些情況下,使用適當的一個鑄件鑄造一個到另一個實例。

但是你不能投一個std::vector到另一個的std::vector,因爲它似乎你正試圖在這裏做。兩個矢量類都不是直接超類或其他矢量類的子類。 std::vector是一個模板。模板的每個實例都是它自己的獨特類,它與模板的任何其他實例無關(除非明確聲明,因此,使用專業化等)

+0

可能是我不明白的東西,但我實際上試圖將一個指向子類*指針向量的指針轉換爲指向基類*指針向量的指針。也就是說,我試圖將矢量>作爲矢量>處理。不是矢量作爲矢量。這仍然無效嗎? – user3496846

+1

是的,它仍然無效。矢量包含的內容無關緊要。您正在投射的課程是兩個不同的向量。 std :: vector 和std :: vector 是兩個彼此不相關的獨立類。無論X或Y是什麼,或X是父母還是Y的孩子,或指向父母或孩子的班級都無關緊要。這裏討論的類是兩個不同的向量類。句號。粗略的例子:「class A {X * ptr;}」和「class B {Y * ptr;}」。如果X和Y是彼此的父母或孩子,對於A和B來說並不意味着相同。他們是兩個獨立的班級。 –