在不同子类实例的向量中未访问成员值
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
};
与问题无关,但还有一些想法:
- 你当然可以只使用基地的接口class(这里
Entity
)。
- 公开
index
成员 public 不是很谨慎。一个更安全的选择是将其设为私有,并通过 public getter 访问它。如果只在构造时设置索引,Entity构造函数应该处理它,否则你可以考虑 public setter.
跳出上述问题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
};
与问题无关,但还有一些想法:
- 你当然可以只使用基地的接口class(这里
Entity
)。 - 公开
index
成员 public 不是很谨慎。一个更安全的选择是将其设为私有,并通过 public getter 访问它。如果只在构造时设置索引,Entity构造函数应该处理它,否则你可以考虑 public setter.