2010-08-10 3 views
1

Есть ли способ в C++ создать свой класс таким образом, чтобы указатель на ваш класс дал указание dynamic_cast <>() как передать другому классу, для которого вы завершаете реализацию? Привлечет ли оператор трюк? Представьте, что у меня есть базовый класс абстрактного интерфейса и выведите конкретный элемент из этого, а также конкретный B, но конкретный B обертывает интерфейс объекту типа specificA. Если я получаю запрос, чтобы бросить в concreteA из concreteA, я хотел бы, чтобы работать:Могу ли я преподавать dynamic_cast <>() новые трюки?

class Abstract { 
public: 
    virtual void interface() = 0; 

}; 

class concreteA : public Abstract { 
public: 
    virtual void interface(); 

}; 

class concreteB : public Abstract { 
public: 
    concreteB(concreteA &underlying) 
    : _underlying(&underlying) { 
    } 
    virtual void interface(); 

    operator concreteA*() { 
    return _underlying; 
    } 

private: 
    concreteA *_underlying; 

}; 

void 
myTest() { 
    concreteA myClassA; 
    concreteB myClassB(myClassA); 
    Abstract *abstract = &myClassB; 
    concreteA *underlying = dynamic_cast<concreteA *>(abstract); 
} 

ответ

4

No. Динамичные литой говорят компилятор: «Я не хочу, чтобы изменить этот объект на всех, я просто хочу попытаться взглянуть на него так, как если бы это был другой тип, но не меняйте его. Если вам нужно его изменить, верните NULL или выбросьте исключение ». Динамический отбор не будет пытаться выполнять такие преобразования от вашего имени. Для этого вам нужны static_cast или boost::lexical_cast.

Это происходит потому, что оператор приведения может либо:

  • переинтерпретировать существующий объект на новый лад, не изменяя его
  • изменить объект каким-либо образом для того, чтобы заставить его быть другого типа, например как int -> short или double -> int.

и один литой вызов может делать только один из них, не оба.

Для получения дополнительной информации о «двойном» характере оператора литья вы можете увидеть this article by Eric Lippert, который предназначен для C#, но в основном относится и к C++.

В частности, вы можете видеть, что в последнем выпуске C++ 0x в разделе 5.2.7 это поведение не изменяется с C++ 03.

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