Вот пример вопроса на C++, чтобы узнать результат.STL Контейнер с итератором и наследованием
#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;
}
Выход, который я ожидал, был «1 4 1 4», но правильный ответ «1 4 1 3».
Сверху
x[0]->f()
т.е. х [0] не что иное, как указатель на объект типа A и вызов F() возвращает 1.
x[1]->f()
т.е., х [ 1] - это не что иное, как указатель на объект типа A (указатель базового класса, указывающий на объект производного класса), и вызывает производный класс f(), который возвращает (3 + 1) = 4
Я не уверен, как это ведет себя когда мы добавляем объекты a a D B в вектор контейнер и итерация их через const_iterator с наследованием
i->f()
Я понимаю, это как я это просто указатель на первый элемент, т.е., объект а.
Но что здесь будет?
(i + 1)->f()
Я понимаю, что он указывает на следующий элемент в последовательности т.е. объект, б и вызов F() через указатель производного класса должен вызвать его функцию-член, а не один базовый класс-х?
Так что вы хотите вместо этого контейнер указателей ('станд :: вектор ') или (лучше) контейнер умных указателей (например, как 'std :: vector>' или 'std :: vector >'). –
ysdx
Спасибо, что сообщили мне о нарезке. Я также отредактировал свое понимание x [1]. Не могли бы вы исправить меня, если это не имеет смысла? –