Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как корректно использовать virtual функции в C++ ?


Автор: Nendis 23.2.2013, 12:09
Есть класс:
class A {
public:
virtual string print() {cout << "A"};
}

и 

class B : public A {
public:
virtual string print() {cout << "B"};
}

Я создаю коллекцию-вектор:

vector<A> mylst;

далее заполняю ее след образом:

mylst[0] = A();
mylst[1] = B();

При обращении в цикле к каждому елементу и вызову функции Print() всегда печатаеться сообщение "A" как исправить - что бы печаталось сначала "А" а потом "В" ?

Автор: NoviceF 23.2.2013, 13:17
Так как вектор принимает объекты по значению, происходит срезка и в векторе конструируются только объекты А.

Если нужен полиморфизм, то нужно использовать указатели или ссылки.

Автор: Nendis 23.2.2013, 13:21
Спасибо за ответ. Не могли бы привести мне пример объявления коллекции с поддержкой такого полиромфизма. Если честно, в указателях не силен, а пример в интернете подбной реализации затрудняюсь найти.

Автор: maxim1000 23.2.2013, 14:23
например, так
Код

std::vector<std::unique_ptr<A>> mylst;
mylst.push_back(std::unique_ptr<A>(new A));
mylst.push_back(std::unique_ptr<B>(new B));

Автор: NoviceF 23.2.2013, 14:31
Ну для полноты картины

Код

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class A
{
public:

    virtual ~A() { }

    virtual void print()
    {
        cout << "A" << endl;
    }
};

class B : public A
{
public:

    virtual void print()
    {
        cout << "B" << endl;
    }
};

int main()
{
    std::vector < std::unique_ptr < A >> mylst;
    mylst.push_back(std::unique_ptr<A > (new A));
    mylst.push_back(std::unique_ptr<B > (new B));

    for (std::unique_ptr<A >& x : mylst)
    {
        x->print();
    }
}


http://liveworkspace.org/code/3ijTV2$13

Автор: VSB 23.2.2013, 23:43
NoviceF,  ну уж если по-правильному, то так

Код

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class A
{
public:

    virtual ~A() { }

    virtual void print() const
    {
        cout << "A" << endl;
    }
};

class B : public A
{
public:

    virtual void print() const
    {
        cout << "B" << endl;
    }
};

int main()
{
    vector<unique_ptr<A>> mylst;
    mylst.push_back(unique_ptr<A>(new A));
    mylst.push_back(unique_ptr<B>(new B));

    for (const auto & x : mylst)
    {
        x->print();
    }
}


http://liveworkspace.org/code/1Xz9lx$1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)