Полиморфный список и указатели - PullRequest
0 голосов
/ 17 ноября 2018

Я новичок в C ++ и борюсь с полиморфизмом.У меня есть проект, где мне нужно иметь базовый класс (скажем, Мастер) и три производных класса.

class Master {
public : 
   virtual void run(); 
   //Other attributes non-important for the topic
}

class Derived1 : public Master {
public:
   void run(); 
   //attributes
}

class Derived2 : public Master{
public :
   Derived2(Derived1* ptr1) {ptr = ptr1;} //there comes the cause of the problem
   void run(); 
private : 
   Derived1* ptr;
}

В моем основном я хочу создать полиморфный список vector<Master*> poly_list; Но проблема в том, что этот список содержит только указатели на мастер-класс, поэтому даже если он может вызвать правильную функцию run ();Я не могу отправить адрес Derived1 конструктору Derived2.

Я хотел продолжить так:

int main
{
   vector<Master*> poly_list;
   poly_list.push_back(new Derived1());
   poly_list.push_back(new Derived2(poly_list[0])); 

   return 0
}

И когда я компилирую код, компилятор говорит мне, что он не может преобразовать тип Master в Derived1 для конструктора.

У кого-нибудь есть способ, чтобы это сработало?Заранее спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Да, возьмите указатель Derived1, прежде чем помещать его в список:

vector<Master*> poly_list;

Derived1 *d=new Derived1();
poly_list.push_back(d);
poly_list.push_back(new Derived2(d));

Также, пожалуйста, вместо использования необработанных указателей, пожалуйста, используйте std::unique_ptr умный указатель, чтобы вы моглине теряйте память, если забываете делать delete, как вы делаете в своем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...