在不同子类实例的向量中未访问成员值

Member values not accessed in vector of instances of different subclasses

跳出上述问题Making a vector of instances of different subclasses:当实现一个(指向)不同子类的向量(初始化为vector<Base*>对象)时,我希望能够访问正确的成员变量基于调用的子类。

下面是示例代码:

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

class Entity {
public:

    int index;
    Entity() {};
    virtual ~Entity() {};
    virtual void hit() = 0;
};
class Mesh : public Entity {

public:
    int index;
    Mesh(int x) {this->index=x;};
    virtual void hit() {}
};

int main() {
    vector<unique_ptr<Entity>> objects;
    objects.push_back(unique_ptr<Entity>(new Mesh(35)));
    objects.push_back(unique_ptr<Entity>(new Mesh(10)));

    for ( int i = 0 ; i < objects.size() ; i++ )
        cout << objects[i]->index << endl;

    return 0;
}                                                                                                                                                                          

我期望的地方

35
10

待打印,同时我得到。

0
0

如何在这种情况下访问正确的成员变量值?

问题是由于对继承的误解。如果您按如下方式重新定义 Mesh,它将按预期工作:

class Mesh : public Entity {

public:              
    //int index;     // No don't redefine:  here you'd have two different indexes 
    Mesh(int x) {this->index=x;};
    void hit() override {}   // extraa safety: use override instead of virtual to be sure to override
}; 

Online demo

与问题无关,但还有一些想法:

  • 你当然可以只使用基地的接口class(这里Entity)。
  • 公开 index 成员 public 不是很谨慎。一个更安全的选择是将其设为私有,并通过 public getter 访问它。如果只在构造时设置索引,Entity构造函数应该处理它,否则你可以考虑 public setter.