C++中的矢量容器和静态绑定

Vector container and static binding in C++?

本文关键字:静态绑定 C++      更新时间:2023-10-16

有人可以解释为什么i->value()(i + 1)->value()打印 1 和 3 而不是像x[0]->value() << x[1]->value()那样打印 1 和 4

#include <iostream>
#include <vector>
class A
{
public:
    A(int n = 0) : m_n(n) { }
public:
    virtual int value() const { return m_n; }
    virtual ~A() { }
protected:
    int m_n;
};
class B
    : public A
{
public:
    B(int n = 0) : A(n) { }
public:
    virtual int value() const { return m_n + 1; }
};
int main()
{
    const A a(1); //a.m_n=1
    const B b(3); //b.m_n=3
    const A *x[2] = { &a, &b };
    typedef std::vector<A> V;
    V y;
    y.push_back(a);
    y.push_back(b);
    V::const_iterator i = y.begin();
    std::cout << x[0]->value() << x[1]->value()
              << i->value() << (i + 1)->value() << std::endl;
    return 0;
}

谢谢

y.push_back(b);创建一个A的实例,该实例是bA子对象的副本,并将其推送到向量上。向量上没有B的实例,也不可能有,因此不调用B::value()。阅读有关对象切片的信息

void push_back (const value_type& val);

如果向量定义为 std::vector<A> V,则将创建 valA副本。你在这里看到所谓的切片问题。这就是为什么你应该使用

std::vector<A*> V

std::vector<shared_ptr<A> > V