2015-05-23 2 views
0

Я думаю, что самый простой способ объяснить мою проблему - показать упрощенный пример того, что я пытаюсь сделать.Доступ к производным функциям в полиморфизме

Я использую библиотеку, которая имеет базовый класс в качестве примера, принимает следующее.

class base { 
    void function(); 
} 

Теперь производные классы отделены от библиотеки, и все они содержат одну и ту же функцию.

class derived1 : public base { 
    void derivedFunction(); 
} 

class derived2 : public base { 
    void derivedFuction(); 
} 

В функции, которую я создал, я определяю пару производных классов и строю структуру, содержащую базовый класс. Затем я устанавливаю несколько значений в массиве и использую полиморфизм и устанавливаю значение thisClass как производный класс.

void runMe() { 

    derived1 *thisDerivedClass = new derived1; 
    derived2 *thatDerivedClass = new derived2; 

    struct data { 
      const char * name; 
      int someInt; 
      base thisClass; 
      } dataSets [] = { 
       {"test1", 0, thisDerivedClass}, 
       {"test2", 1, thatDerivedClass} 
      }; 

Когда я пытаюсь вызвать функцию из производной, очевидно, она не работает. Я пытаюсь выяснить, как заставить это работать. Виртуальные классы не имеют смысла, поскольку мне пришлось бы многое изменить. Другим способом, который я знаю, как это сделать, является динамическая и статическая типизация, что не имеет смысла для этой ситуации.

 const int count = sizeof(dataSets)/sizeof(data); 

    for(int i = 0; i < count; i++) { 
      dataSets[i].thisClass->derivedFuction(); 
    } 
} 

Что было бы самым лучшим способом сделать это?

+2

Виртуальные классы? Похоже, вам нужны виртуальные * функции *, а не классы. Кроме того, ваша структура имеет объект 'base'. Разве это не должно быть «основанием»? – PaulMcKenzie

+0

Моя ошибка, да и да. –

ответ

0

Ваша ситуация - это то, для чего были изобретены полиморфизм и виртуальные функции. Объявите виртуальную функцию в базовом классе, затем переопределите ее в производных классах. Затем ваш вызов base::function() автоматически разрешит правильную производную функцию класса.

+0

Я согласен, я думаю, что я сделаю, это перестроить свой код для работы с используемой инфраструктурой. –

Смежные вопросы