带迭代器和继承的STL容器 这里是一个C++问题的样本来找出结果。

带迭代器和继承的STL容器 这里是一个C++问题的样本来找出结果。,c++,c++11,stl,iterator,object-slicing,C++,C++11,Stl,Iterator,Object Slicing,#include <iostream> #include <vector> class A { public: A(int n = 0) : m_n(n) { } public: virtual int f() const { return m_n; } virtual ~A() { } protected: int m_n; }; class B : public A { public: B(int n = 0)

#include <iostream>
#include <vector>

class A
{
public:
    A(int n = 0) : m_n(n) { }

public:
    virtual int f() const { return m_n; }
    virtual ~A() { }

protected:
    int m_n;
};

class B
    : public A
{
public:
    B(int n = 0) : A(n) { }

public:
    virtual int f() const { return m_n + 1; }
};

int main()
{
    const A a(1);
    const B b(3);
    const A *x[2] = { &a, &b };
    typedef std::vector<A> V;
    V y({ a, b });
    V::const_iterator i = y.begin();

    std::cout << x[0]->f() << x[1]->f()
              << i->f() << (i + 1)->f() << std::endl;

    return 0;
}
i、 例如,x[0]只不过是指向类型为a的对象的指针,调用f()返回1

x[1]->f()
i、 例如,x[1]只不过是指向a类型对象的指针(指向派生类对象的基类指针),并调用派生类f(),该派生类返回(3+1)=4

我不确定当我们将对象a和b添加到向量容器中,并使用继承通过常量迭代器对它们进行迭代时,这是如何表现的

i->f()
我可以理解这一点,因为我只是指向第一个元素的指针,即对象a

但这里会发生什么

(i + 1)->f()

我的理解是,它指向序列中的下一个元素,即对象b,通过派生类指针调用f()应该调用其成员函数,而不是基类1的?

向量
y
包含两个
A
类型的对象。不是类型
B
。构建时,它会复制
a
b
b
。因此
(i+1)->f()
b
A
部分的副本上调用
A::f()
,得到3。

所以你想要的是指针的容器(
std::vector
)或者(更好的)智能指针的容器(比如
std::vector
或者
std::vector
).谢谢你让我知道切片的事。我还编辑了我对x的理解[1]。如果没有道理,请你纠正我好吗?
(i + 1)->f()