Как поместить наследники класса в один массив типа родителя?

Тема в разделе "Arduino & Shields", создана пользователем Vetrinus, 4 фев 2018.

  1. Vetrinus

    Vetrinus Гик

    Собственно, сабж.
    Есть класс, у которого есть виртуальный метод, перезагруженный в потомках.
    Нужно потомки класса хранить в одном массиве типа родителя.
     
  2. DIYMan

    DIYMan Guest

    Если я правильно понял вопрос - то всё просто:
    Код (C++):
    class Parent
    {
        public:
     
            Parent();
            virtual ~Parent();
         
            virtual void Method() = 0;
    };

    class Child : public Parent
    {
        public:
     
            virtual void Method();
     
    };


    Parent* array[10] = {NULL};

    for(int i=0;i<10;i++)
    {
        array[i] = new Child();
    }
     
  3. b707

    b707 Гуру

    Vetrinus/ поместить=то в массив - просто, см выше. Но вы, как мне кажется, делаете это для того. чтобы извлекать из массива типа "родитель" экземпляры потомков и применять для каждого потомка его перегруженный метод? - Это у вас так просто не выйдет. Для этого необходимо будет вручную привести каждый элемент массива к своему типу класса потомка. так как по умолчанию элементы массива будут разрешаться в типе родителя.
     
  4. DIYMan

    DIYMan Guest

    Чой-то? По указателю на родителя перегруженный виртуальный метод родителя прекрасно вызывается без каста. Если брать как пример мой код, приведённый выше, то чтобы вызвать метод Method у потомка (Child), то достаточно сделать
    Код (C++):
    Parent* p = array[5];

    p->Method();
    Всё. Другое дело, если потомки, вдобавок к имеющимся в VT записям добавляют свои, невиртуальные методы, тогда придётся кастить:
    Код (C++):
    class Parent
    {
        public:
     
            Parent();
            virtual ~Parent();
         
            virtual void Method() = 0;
    };

    class Child : public Parent
    {
        public:
     
            virtual void Method();
            void Method2();
     
    };


    Parent* array[10] = {NULL};

    for(int i=0;i<10;i++)
    {
        array[i] = new Child();
    }

    Parent* virtualCall = array[5];

    virtualCall->Method(); // канает
    virtualCall->Method2(); // не канает

    Child* childCall = (Child*) virtualCall;
    childCall->Method2(); // канает
     
    b707 и DetSimen нравится это.
  5. DetSimen

    DetSimen Guest

    Да, я с DIYMan согласен. все потомки совместимы по присваиванию с родителем безо всяких кастов. И вирт.методы вызываются правильные. Для того VMT и придумана.