наследование — векторный контейнер и статическое связывание в C ++?

Может кто-нибудь объяснить, почему i->value() а также (i + 1)->value() отпечатки 1 и 3, а не 1 и 4, как x[0]->value() << x[1]->value()

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

Спасибо

0

Решение

y.push_back(b); создает экземпляр A которая является копией A подобъект в bи выталкивает это на вектор. Там нет случаев B на векторе, и не может быть, так B::value() не называется. Прочитать о нарезка объектов

5

Другие решения

void push_back (const value_type& val);

создаст A копия val если вектор определен как std::vector<A> V,
Вы видите здесь так называемый проблема нарезки.
Вот почему вы должны использовать

std::vector<A*> V

или же

std::vector<shared_ptr<A> > V
3

По вопросам рекламы [email protected]