我有一个水果类和一个从水果中继承的苹果。
让我们说我有各种各样的水果。我可以说苹果,香蕉和其他水果。
问题:当我尝试从该数组的元素(水果的子元素)获取值时,它将无法编译。
class Fruit{
public:
Fruit();
}
class Apple : public Fruit{
public:
Apple();
int count; //number of apples in the store
}
int main(){
Fruit market[3];
market[0] = Apple();
int apples = market[0].count;
}
我知道这是因为程序不知道它正在看苹果;但如果我当然知道它是一个苹果(例如通过检查),我如何访问Apple.count?
答案 0 :(得分:8)
你不能这样做。数组是一串线性字符,它将一个对象存储在下一个对象旁边。因此,它们都必须具有相同的尺寸。由于Apple不适合Fruit所占用的空间,因此您无法将Apple存储在适用于Fruit的阵列插槽中。
您可以做的是存储指针数组。这是保持多态类型的常用解决方案:
std::array<Fruit*, 3> market;
market[0] = new Apple();
// ...
delete market[0];
由于指针通常在一个程序中具有单个大小,因此通过指针存储不同类型是明智的。你也可以使用C ++“智能指针”,如下所示:
std::array<std::unique_ptr<Fruit>, 3> market;
market[0].reset(new Apple());
// ...
// delete is called automatically
现在,如果您需要访问count
,您有两个选择。如果您确定market[0]
是Apple
,则可以使用:
static_cast<Apple&>(market[0]).count
如果您不确定,可以查看:
if (Apple* apple = dynamic_cast<Apple*>(&market[0])) {
// use apple->count
} else {
// it's not an Apple
}
答案 1 :(得分:0)
但如果不是每个水果都有数量(这里的市场就是一个不好的例子) - RIJIK 25秒前
然后你运气不好。你需要垂头丧气。并改为某种形式的引用语义。