2015-07-29 4 views
1

У меня есть класс с именем AbsAlgorithm с тремя чистыми виртуальными функциями, как это:Преобразовать родитель ребенок

class AbsAlgorithm 
{ 
public: 
    //...other methods 
    virtual void run() = 0; 
    virtual bool init(TestCase&) = 0; 
    virtual void done() = 0; 
}; 

Этот класс в моем исполняемом, называется algatorc. Конечный пользователь должен создать проект algatorc и должен также реализовать эти три метода. Но проблема в том, что он также должен унаследовать класс TestCase. который является параметром в методе init. В моей основной программе я должен скомпилировать код, который написал пользователь, и построить динамическую библиотеку и загрузить ее в мою программу. Я это сделал. Проблема заключается в том, что я вызываю метод init.

Пример:

Пользователь создает новый проект под названием algatorc Sorting.

Таким образом, он заканчивает с тремя классами:

  • SortingTestSetIterator
  • SortingTestCase
  • SortingAbsAlgorithm

В этом SortingAbsAlgorithm он наследует AbsAlgorithm и реализует чисто виртуальные методы. В SortingTestCase он должен унаследовать класс TestCase и в SortingTestSetIterator он должен наследовать TestSetIterator и реализовать метод под названием get_current(), который возвращает TestCase.

Моя главная программа, которую я загружен SortingTestSetIterator в TestSetIterator, как это:

create_it = (TestSetIterator* (*)())dlsym(handle, "create_iterator_object"); 
TestSetIterator *it = (TestSetIterator*)create_it(); 

Так что теперь, я могу назвать такие методы, как TestSetIterator::get_current() (этот метод возвращает указатель на TestCase, но пользователь возвращает объект SortingTestCase). Но когда я называю этот метод, в результате получаю TestCase. Все в порядке, но тогда мне нужно передать это AbsAlgorithm::init(...). Конечно, все еще не проблема, но когда пользователь реализовал метод init(...), он должен преобразовать его в дочерний класс (SortingTestCase). Это возможно?

Я знаю, что это тривиально в Java, но я не знаю, как это сделать на C++. Или это способ, которым я определяю метод TestCase* TestSetIterator::get_current(), а затем пользователь каким-то образом переопределяет это так, чтобы возвращаемый тип был SortingTestCase? Это решит проблему?

В основном, проблема заключается в следующем:

У меня есть метод, который возвращает SortingTestSetIterator::get_current() указатель на экземпляр класса SortingTestCase. Итак, можно ли каким-либо образом преобразовать родительский элемент в дочерний?

+0

Быстрое и грязное решение в C++ должно было бы использовать 'dynamic_cast' a la' SortingTestCase * sort_case = dynamic_cast (test_case); 'В противном случае вам, возможно, придется реализовать еще одну логику, такую ​​как шаблон посетителя, заставить эти классы общаться друг с другом. – YoungJohn

+0

'error: не может dynamic_cast 'test_case' (типа 'class TestCase *'), чтобы набрать 'class SortingTestCase *' (тип источника не является полиморфным)' Означает ли это, что класс 'TestCase' не является полиморфным? Как сделать его полиморфным? – golobich

+0

@golobich: для того, чтобы быть полиморфным, 'TestCase' должен иметь хотя бы одну виртуальную функцию. Это почти наверняка нуждается в виртуальном деструкторе, или у вас будут проблемы, когда вы попытаетесь очистить вещи ... –

ответ

0

Если вы хотите бросить родителей к детям, все, что вам нужно сделать, это написать это:

child = dynamic_cast<Child*>(parent_object) 

Но для того, чтобы сделать это, ваш класс источника (родительский класс) должен иметь по крайней мере один виртуальный метод! Это почти наверняка нуждается в виртуальном деструкторе, или у вас будут проблемы, когда вы попытаетесь очистить вещи ...

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