我想迭代不同的对象,这些对象都来自同一个超类。这意味着我有一个像这样的超类:
class fruit
{
public:
fruit()
{
}
};
我有这样的子类,它定义了我的代码中使用的对象:
class apple: public fruit
{
public:
apple()
{
}
};
class banana: public fruit
{
public:
banana()
{
}
};
现在我想迭代所有水果(苹果,香蕉):
for ( first fuit; last fruit; next fruit )
{
// do something, no matter if apple or banana
}
但是我应该怎么做,因为苹果和香蕉是不同的类类型,但它们共享相同的超类。这就是为什么我认为必须有一种优雅的方式来实现它。
答案 0 :(得分:1)
C ++没有任何类型的内置对象注册表,您可以在其中访问特定类型的每个现有对象。但是,C ++有多种container类型,可用于在各种不同的数据结构中存储多个对象。
由于您存储的对象具有不同的类型,但具有共同的基本类型,you need to use pointers or references以实现多态行为并避免object slicing。
例如,您可以使用std::unique_ptr
个对象的矢量。
std::vector<std::unique_ptr<fruit>> fruits;
fruits.emplace_back(new apple);
fruits.emplace_back(new banana);
for (auto &fruit : fruits) {
// fruit is a reference to the unique_ptr holding the pointer-to-fruit. Use
// the "indirect access to member" operator -> to access members of the
// pointed-to object:
fruit->some_method();
}
使用此方法(unique_ptr
对象的向量)的优点是,当向量为时,您的苹果和香蕉对象会自动销毁。否则,您必须手动delete
,这是一种非常容易出错的方法。