Вот пример кода, объясняющего, чего я пытаюсь достичь.
По сути, у меня есть алгоритм, который зависит от некоторых основных операций, доступных в классе. Я определил эти операции в чисто абстрактном базовом классе. Я хочу применить этот алгоритм к множеству объектов, которые обеспечивают эти операции, путем получения классов для конкретных объектов.
Однако различные производные объекты несовместимы друг с другом в том, что касается этих операций. Мой вопрос заключается в том, могу ли я избежать использования RTTI для того, чтобы, например, bool производный 2 :: идентичный (const base * other2), утверждал (или другой механизм выхода), где other2 не имеет типа производного 2.
Одной из альтернатив будет шаблон алгоритма функции для конкретного производного объекта, но это будет означать, что его реализация должна будет жить в заголовочном файле, чего я не хочу делать, так как 1) Изменение кода алгоритма для теста цели могут вызвать перекомпиляцию больших частей кода. 2) Реализация алгоритма будет отображаться в заголовке, а не жить в исходном файле, скрытом от конечного пользователя.
Заголовочный файл
#include <list>
class base
{
public:
virtual float difference(const base*) const = 0;
virtual bool identical(const base*) const = 0;
};
class derived1 : public base
{
public:
float difference(const base* other1) const
{
// other1 has to be of type derived1
if(typeid(other1) == typeid(this))
{
// process ...
}
else
{
assert(0);
}
return 1;
}
bool identical(const base* other1) const
{
// other1 has to be of type derived1
if(typeid(other1) == typeid(this))
{
// compare...
}
else
{
assert(0);
}
return true;
}
};
class derived2 : public base
{
public:
float difference(const base* other2) const
{
// process ...
// other2 has to be of type derived2
return 2;
}
bool identical(const base* other2) const
{
// do comparison
// derived1 and derived2 cannot be compared
return true;
}
};
// Declaration
int algorithm(std::list<base*>& members);
Реализация алгоритма Исходный файл
#include "header_file_containing_base"
int algorithm(std::list<base*>& members)
{
// This function only relies on the interface defined in base
// process members;
return 1;
}
Основная программа
int main()
{
// Create lists of derived1 and derived2
// Run algorithm on these lists
}