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
的实例,它是b
中A
子对象的副本,并将其推送到向量上。向量上没有B
的实例,也不可能有,因此不会调用B::value()
。阅读object slicing
【讨论】:
相反,在创建x
时不会发生切片,因为x
持有指向A
类对象的指针或引用(在本例中为指针)。【参考方案2】:
void push_back (const value_type& val);
如果向量定义为std::vector<A> V
,将创建val
的A
副本。
你在这里看到所谓的slicing problem。
这就是为什么你应该使用
std::vector<A*> V
或
std::vector<shared_ptr<A> > V
【讨论】:
以上是关于C ++中的矢量容器和静态绑定?的主要内容,如果未能解决你的问题,请参考以下文章