在使用auto循环向量时使用子类成员

时间:2015-08-18 13:12:42

标签: c++ vector

通过向量循环时是否可以访问子类的成员?

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;
}

2 个答案:

答案 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而不是原始指针,除非您有充分的理由使用后者)