Я пытаюсь добавить несколько элементов подкласса в вектор, перебирать их, вызывая переопределенный метод, и хочу, чтобы он вызывал переопределенный метод, где это возможно. Однако я обнаружил, что он вызывает только метод суперкласса.
Я изучил Java и не знаю, почему это делается на C++. Я попытался переписать код, используя вектор указателей суперкласса и приведя указатель подкласса к суперклассу. Затем доступ к этому через указатели работает.
В идеале я не хочу помещать список указателей в вектор, так как тогда мне придется вручную удалять каждый (я полагаю?), чтобы остановить утечку памяти, так как я буду создавать объекты с помощью new, чтобы они сохранялись после вызова метода для добавить их в вектор.
Есть ли лучший способ сделать это, или я придерживаюсь использования указателей и вызова удаления для созданных объектов, когда родительский класс не нужен? Предпочтительно, чтобы вектор был списком класса X, а не списком указателей класса X.
Моя структура:
class a { vector vec of class X,
method to create and add an instance of X into vector vec,
method to create and add an instance of Y into vector vec }
class X { talk() }
class Y : public X { talk() }
Код, демонстрирующий то, что я в идеале хочу сделать, но показывающий, что он сломан, только вызывая метод суперкласса:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
class A {
public:
virtual void talk() { printf("A\n"); }
};
class B: public A {
public:
void talk() { printf("B\n"); }
};
int main(void) {
std::vector<A> vec;
std::vector<A*> vec2;
A a;
B b;
a.talk();
b.talk();
vec.push_back(a);
vec.push_back(b);
vec2.push_back(&a);
vec2.push_back(&b);
for(int i = 0; i < vec.size(); i++) {
vec[i].talk();
vec2[i]->talk(); //bad but short for example
}
}
std::unique_ptr
), чтобы получить полиморфное поведение. См. разделение объектов. Это работает в Java, потому что тамMyClass obj
эффективно объявляет указатель наMyClass
. - person Igor Tandetnik   schedule 19.07.2014talk()
не является виртуальным вA
, поэтому нет метода для переопределения. Компилятор будет использовать статический тип, а именноA
. - person 0x499602D2   schedule 19.07.2014