У меня есть класс с именем 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
. Итак, можно ли каким-либо образом преобразовать родительский элемент в дочерний?
Быстрое и грязное решение в C++ должно было бы использовать 'dynamic_cast' a la' SortingTestCase * sort_case = dynamic_cast (test_case); 'В противном случае вам, возможно, придется реализовать еще одну логику, такую как шаблон посетителя, заставить эти классы общаться друг с другом. –
YoungJohn
'error: не может dynamic_cast 'test_case' (типа 'class TestCase *'), чтобы набрать 'class SortingTestCase *' (тип источника не является полиморфным)' Означает ли это, что класс 'TestCase' не является полиморфным? Как сделать его полиморфным? – golobich
@golobich: для того, чтобы быть полиморфным, 'TestCase' должен иметь хотя бы одну виртуальную функцию. Это почти наверняка нуждается в виртуальном деструкторе, или у вас будут проблемы, когда вы попытаетесь очистить вещи ... –