从 child 获取变量

Get variable from child

我有一个水果 class 和一个继承水果的苹果。 假设我有一系列不同种类的水果。我可以说苹果、香蕉和其他水果。
问题:当我尝试从该数组的一个元素(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?

你不能这样做。数组是一串线性字节,它存储一个相邻的对象。因此,它们都必须具有相同的大小。由于 Apple 不适合 Fruit 占用的 space,因此您不能将 Apple 存储在用于 Fruit 的数组槽中。

您可以做的是存储一个指针数组。这是保持多态类型的常用解决方案:

std::array<Fruit*, 3> market;
market[0] = new Apple();
// ...
delete market[0];

由于指针在一个程序中通常具有单一大小,因此通过指针存储不同的类型是明智的。您也可以像这样使用 C++ "smart pointers,":

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
}

but if not every fruit has a count (the market is a bad example here) – RIJIK 25 secs ago

那你倒霉了。你需要垂头丧气。并更改为某种形式的引用语义。