在我的程序中,我有一個包含許多繼承類的基類。我需要存儲這些繼承對象(或任何容器)的列表。我能想到的唯一方法是通過使用某種枚舉類型的Base類的列表,然後向下轉換爲繼承類型。繼承對象列表 - C++
不得不經常施放我的物體似乎是一個沉重的懲罰,只是試圖讓我的對象在一些容器中。
還有其他的選擇嗎?鑄造不像看起來那麼糟糕?
感謝您的幫助!
在我的程序中,我有一個包含許多繼承類的基類。我需要存儲這些繼承對象(或任何容器)的列表。我能想到的唯一方法是通過使用某種枚舉類型的Base類的列表,然後向下轉換爲繼承類型。繼承對象列表 - C++
不得不經常施放我的物體似乎是一個沉重的懲罰,只是試圖讓我的對象在一些容器中。
還有其他的選擇嗎?鑄造不像看起來那麼糟糕?
感謝您的幫助!
使用多態,這就是他們在那裏什麼:
#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
這個例子有很多語法錯誤,也不起作用。將派生實例(而不是指針)複製到「列表」中將它們切片到基本實例中。 – Wyzard 2012-04-17 01:08:56
固定。是多任務處理,並沒有密切關注。 – keelerjr12 2012-04-17 01:15:41
我添加了必要的包含,以便它實際編譯。另外,請注意其他讀者,'mem_fn'需要C++ 11或TR1。 – Wyzard 2012-04-17 01:21:21
沒有直接支持的以編程方式獲取基類的所有子類的列表的方式。
你可以在你的代碼中做到這一點,讓每個子類通過對一些函數的調用進行註冊,並獲得該函數來接受/存儲所需的數據。
但是,如果您不斷將對象從基類轉換爲派生類,那麼您可能沒有充分利用多態性。通過虛擬函數
爲什麼你需要將它們轉換成基本類型?您應該使用虛擬功能。 – 2012-04-17 00:45:53
我不認爲有可能調用繼承方法,只有基類的引用。它不會只是調用基本方法嗎?我以爲我需要投到繼承類來調用它的虛擬方法。我錯了嗎? – 2012-04-17 00:48:56
是的,你錯了,如果基本方法被標記爲「虛擬」,將繼續調用繼承的方法。 – Jem 2012-04-17 00:50:17