从孩子那里得到变数

时间:2015-12-18 15:40:26

标签: c++ class inheritance parent-child

我有一个水果类和一个从水果中继承的苹果。 让我们说我有各种各样的水果。我可以说苹果,香蕉和其他水果。
问题:当我尝试从该数组的元素(水果的子元素)获取值时,它将无法编译。

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?

2 个答案:

答案 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秒前

然后你运气不好。你需要垂头丧气。并改为某种形式的引用语义。