在C++中,有没有一种方法可以构造您的类,以便在给定指向您类的指针的情况下,您可以指示dynamic_cast ()如何转换为要为其包装实现的另一个类?运算符(operator)会撒谎吗?想象一下,我有一个Abstract接口(interface)基类,并从该接口(interface)派生了ConcreteA以及ConcreteB,但是ConcreteB将接口(interface)包装到类型为ConcreteA的对象。如果我有要求从ConcreteA转换为ConcreteA的请求,我希望它可以正常工作: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;};voidmyTest() { concreteA myClassA; concreteB myClassB(myClassA); Abstract *abstract = &myClassB; concreteA *underlying = dynamic_cast<concreteA *>(abstract);} (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 否。动态类型转换告诉编译器“我根本不想更改此对象,我只想尝试将其视为其他类型,但不必对其进行更改。如果必须更改它,返回NULL或引发异常。”。动态转换不会尝试代表您执行任何此类转换。为此,您需要static_cast或boost::lexical_cast。这是因为强制转换运算符可以:以新方式重新解释现有对象,而不更改它。以某种方式更改对象以强制其为另一种类型,例如int-> short或double-> int。 并且一个强制转换调用只能做到其中一个,而不能两者都做。有关强制转换运算符的“双重”性质的更多信息,您可以看到this article by Eric Lippert,它针对C#,但也同样适用于C++。具体来说,您可以在最新的C++ 0x草案中看到§5.2.7,该行为与C++ 03相同。 (adsbygoogle = window.adsbygoogle || []).push({});
09-26 19:56