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

Posted

技术标签:

【中文标题】C ++中的矢量容器和静态绑定?【英文标题】:Vector container and static binding in C++? 【发布时间】:2013-08-10 14:54:17 【问题描述】:

谁能解释一下为什么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;

谢谢

【问题讨论】:

Bjarne Stroustrup 说,如果您了解 victor,那么您也了解 C++。他们是最好的朋友,他们总是一起四处游荡。 【参考方案1】:

y.push_back(b); 创建A 的实例,它是bA 子对象的副本,并将其推送到向量上。向量上没有B 的实例,也不可能有,因此不会调用B::value()。阅读object slicing

【讨论】:

相反,在创建x 时不会发生切片,因为x 持有指向A 类对象的指针或引用(在本例中为指针)。【参考方案2】:
void push_back (const value_type& val);

如果向量定义为std::vector&lt;A&gt; V,将创建valA 副本。 你在这里看到所谓的slicing problem。 这就是为什么你应该使用

std::vector<A*> V

std::vector<shared_ptr<A> > V

【讨论】:

以上是关于C ++中的矢量容器和静态绑定?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的静态绑定和动态绑定

面经中高频知识点归纳

day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态

C++--多态

C++---多态

C++--多态