Вызов метода дочернего класса на векторе родительского класса - PullRequest
3 голосов
/ 06 сентября 2011
#include <iostream>
#include <vector>

using namespace std;

class Parent {
public:
    Parent();
    void method();
};

class Child: public Parent {
public:
    Child();
    void method();
};

int main() {
    vector<Parent> v;
    v.push_back(Parent());
    v.push_back(Child());
    v[0].method();
    v[1].method();
    return 0;
}

Parent::Parent() {}

void Parent::method() {
    cout << "Parent." << endl;
}

Child::Child() {}

void Child::method() {
    cout << "Child." << endl;
}

В принципе, я ожидаю, что эта программа напечатает

Parent.
Child.

но печатает это вместо:

Parent.
Parent.

C ++ удивляет меня еще раз:).
Почему это происходит? Что я могу сделать, чтобы вызвать Child :: method для экземпляров Child в векторе и Parent :: method для экземпляров Parent?

Я использую gcc:

gcc version 4.6.1 20110819 (prerelease) (GCC)

как это:

g++ -Wall -Wextra -c main.cpp
g++ -Wall -Wextra -o main main.o

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

Вы столкнулись с проблемой нарезки .

vector<Parent>.push_back() копирует свой аргумент, поэтому он вызывает Parent::Parent(const Parent &) (т.е. конструктор копирования) *.

Это действительно ничем не отличается от:

Parent x[10];

x[0] = Parent();
x[1] = Child();

* Или это может быть Parent::operator=(const Parent &), т. Е. Назначение копирования. Я устал и не могу вспомнить, что ему нужно.

0 голосов
/ 06 сентября 2011

Вектор хранит Parent с, а не Children с.

Если вы хотите воспользоваться преимуществами полиморфизма, храните указатели вместо этого ... но будьте чертовски уверены, что это то, что вы хотите.

...