Алмазное наследование без 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...

0 ответов

Другие вопросы по тегам