通过向量循环时是否可以访问子类的成员?
struct Object
{
std::string name;
};
struct Rect : Object
{
int x;
int y;
int width;
int height;
};
struct Circle : Object
{
int x;
int y;
int radius;
}
运行下面的代码会给我一个错误struct Object has no member named 'x'
我猜是因为auto&
将其视为Object
。迭代器有没有办法使用Rect
成员?
int main()
{
std::vector<Object> objects;
Rect r;
r.name = "test";
r.x = 1;
r.y = 1;
objects.push_back(r);
for(auto& ob: objects)
{
std::cout << ob.x << std::endl;
}
return 0;
}
答案 0 :(得分:1)
是的,有可能,auto
只是语法糖。但是,在您的示例中,您循环遍历Object
s的向量,所以
for(auto& ob: objects)
{
std::cout << ob.x << std::endl;
}
与
相同for(Object& ob: objects)
{
std::cout << ob.x << std::endl;
}
您的Object
班级没有x
成员(您的Rect
班级,该班级来自Object
),因此错误(您遇到{ {3}})。
答案 1 :(得分:0)
C ++标准容器包含对象,而不是其他语言中的引用。这意味着当您在容器中存储子类的对象时,您只需存储由复制构造函数(或运算符=取决于所使用的方法)获取的对象。因此,您只存储一个既没有字段也没有子类方法的基类对象。正如Joachim Pileborg在评论中所说的那样,这被称为object slicing。
如果要存储子类对象,则必须使用指针(优先使用unique_ptr或shared_ptr而不是原始指针,除非您有充分的理由使用后者)