2016-02-16 3 views
2

Вот пример вопроса на 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() через указатель производного класса должен вызвать его функцию-член, а не один базовый класс-х?

ответ

5

Вектор y содержит два объекта типа A. Не тип B. Когда он построен, он делает копии a и b, slicingb, как он это делает. Так (i + 1)->f() называет A::f() на этой копии A части b, давая 3.

+1

Так что вы хотите вместо этого контейнер указателей ('станд :: вектор ') или (лучше) контейнер умных указателей (например, как 'std :: vector >' или 'std :: vector >'). – ysdx

+0

Спасибо, что сообщили мне о нарезке. Я также отредактировал свое понимание x [1]. Не могли бы вы исправить меня, если это не имеет смысла? –