Я создал абстрактный класс, а затем создал дочерние классы, которые наследуют этот абстрактный класс.
class A{
public:
virtual A* clone() const = 0;
virtual A* create() const = 0;
~virtual A(){};
// etc.
};
дочерние классы
class B: public A{};
class C: public A{};
Затем я использую неявное преобразование указателя дочернего класса в указатель базового класса в основной функции.
int main(){
B* pB = new B();
C* pC = new C();
A* pA = pB; //converting a pointer to A, to a pointer to B
A* pAA = pC; //converting a pointer to A, to a pointer to C
Теперь я могу заполнить вектор этими классами, используя указатель типа A, и получить доступ к дочерним классам с помощью полиморфизма.
vector<A*> Pntr;
Однако я хочу, чтобы каждый дочерний класс брал на себя ответственность за освобождение памяти. Я знаю, что могу использовать для этого уникальные указатели. Вопрос в том, как мне это реализовать.
Если я закодирую это так:
pA = unique_ptr<A>(pB);
pAA = unique_ptr<A>(pC);
Затем я заполняю вектор следующим образом:
vector<unique_ptr<A>>Pointers;
Pointers.push_back(move(pA));
Pointers.push_back(move(pAA));
Не уверен, что это даже сработает. И я также смущен тем, что он будет фактически уничтожен, когда вектор выйдет за рамки. Будут ли преобразованные указатели pA и pAA просто установлены в NULL или объекты класса будут уничтожены - что является моим первоначальным намерением. Нужна некоторая ясность.
unique_ptr
необработанному указателю, что, похоже, вы и делаете. - person Barry   schedule 17.07.2015