RIJ*_*JIK 2 c++ inheritance class 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;
}
Run Code Online (Sandbox Code Playgroud)
我知道这是因为程序不知道它正在看苹果; 但如果我当然知道它是一个苹果(例如通过检查),我如何访问Apple.count?
你不能这样做.数组是一串线性字符,它将一个对象存储在下一个对象旁边.因此,它们都必须具有相同的尺寸.由于Apple不适合Fruit所占用的空间,因此您无法将Apple存储在适用于Fruit的阵列插槽中.
你可以做的是存储一个指针数组.这是保持多态类型的常用解决方案:
std::array<Fruit*, 3> market;
market[0] = new Apple();
// ...
delete market[0];
Run Code Online (Sandbox Code Playgroud)
由于指针通常在一个程序中具有单个大小,因此通过指针存储不同类型是明智的.您也可以使用C++"智能指针",如下所示:
std::array<std::unique_ptr<Fruit>, 3> market;
market[0].reset(new Apple());
// ...
// delete is called automatically
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要访问,count您有两个选择.如果您确定market[0]是Apple,那么您可以使用:
static_cast<Apple&>(market[0]).count
Run Code Online (Sandbox Code Playgroud)
如果您不确定,可以查看:
if (Apple* apple = dynamic_cast<Apple*>(&market[0])) {
// use apple->count
} else {
// it's not an Apple
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |