Алмазное наследование без RTTI
Я проектирую объектную систему, в которой все мои объекты происходят из общего базового класса. Помимо объектов, у меня есть определенные интерфейсы, которые я хочу, чтобы объекты реализовали. Некоторые объекты происходят из нескольких классов.
Я застрял с проблемой наследования алмазов, в том случае, если я заставляю объекты наследовать интерфейсы, используя virtual public
Я должен использовать dynamic_cast
бросать от основания к производному. Однако используемый мной компилятор (встроенный компилятор для arm) не имеет RTTI.
В основном я ищу обходные пути. Во время поиска я наткнулся на шаблон посетителя, но это кажется немного странным, и в результате я получаю множество виртуальных функций, о которых должен знать базовый класс. Я также сталкивался с типом стирания, что-то вроде boost::any
,
Мой другой вопрос: работает ли стирание типов в моем случае? В настоящее время все мои объекты передаются как базовые указатели в пользовательских общих указателях (опять же, shared_ptr
не доступен). Затем, скажем, если объект реализует callable
интерфейс I static_cast
базовый указатель на callable
указатель, и назовите его run
метод. Но определенные объекты должны реализовывать оба callable
а также iterable
вот тогда возникают проблемы.
Мои основные цели - GCC и Clang в режиме C++11.
class A
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};
class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};
D d;
A* pa = static_cast(&d);
D* pd = static_cast(pa); // can't do that! dynamic_cast does work though...