2012-04-17 104 views
0

在我的程序中,我有一個包含許多繼承類的基類。我需要存儲這些繼承對象(或任何容器)的列表。我能想到的唯一方法是通過使用某種枚舉類型的Base類的列表,然後向下轉換爲繼承類型。繼承對象列表 - C++

不得不經常施放我的物體似乎是一個沉重的懲罰,只是試圖讓我的對象在一些容器中。

還有其他的選擇嗎?鑄造不像看起來那麼糟糕?

感謝您的幫助!

+4

爲什麼你需要將它們轉換成基本類型?您應該使用虛擬功能。 – 2012-04-17 00:45:53

+0

我不認爲有可能調用繼承方法,只有基類的引用。它不會只是調用基本方法嗎?我以爲我需要投到繼承類來調用它的虛擬方法。我錯了嗎? – 2012-04-17 00:48:56

+1

是的,你錯了,如果基本方法被標記爲「虛擬」,將繼續調用繼承的方法。 – Jem 2012-04-17 00:50:17

回答

6

使用多態,這就是他們在那裏什麼:

#include <algorithm> 
#include <functional> 
#include <iostream> 
#include <list> 

using namespace std; 

class A { 
public: 
    virtual void print() { 
    cout << "This is an A object" << endl; 
    } 
}; 

class B : public A { 
public: 
    virtual void print() { 
    cout << "This is a B object" << endl; 
    } 
}; 

class C : public A { 
public: 
    virtual void print() { 
    cout << "This is a C object" << endl; 
    } 
}; 

class D : public B { 
    // empty 
}; 

int main() { 
    std::list<A*> objects; 
    objects.push_back(new A()); 
    objects.push_back(new B()); 
    objects.push_back(new C()); 
    objects.push_back(new D()); 

    for_each(objects.begin(), objects.end(), mem_fun(&A::print)); 

    return 0; 
} 

// outputs: 
// This is an A object 
// This is a B object 
// This is a C object 
// This is a B object 
+0

這個例子有很多語法錯誤,也不起作用。將派生實例(而不是指針)複製到「列表」中將它們切片到基本實例中。 – Wyzard 2012-04-17 01:08:56

+0

固定。是多任務處理,並沒有密切關注。 – keelerjr12 2012-04-17 01:15:41

+0

我添加了必要的包含,以便它實際編譯。另外,請注意其他讀者,'mem_fn'需要C++ 11或TR1。 – Wyzard 2012-04-17 01:21:21

1

沒有直接支持的以編程方式獲取基類的所有子類的列表的方式。

你可以在你的代碼中做到這一點,讓每個子類通過對一些函數的調用進行註冊,並獲得該函數來接受/存儲所需的數據。

但是,如果您不斷將對象從基類轉換爲派生類,那麼您可能沒有充分利用多態性。通過虛擬函數