2012-01-17 77 views
1

前段时间,我正在和一群演员操作,这显然我当时并没有真正掌握。现在,我一直在寻找在我的代码,我看到了这一点:引用/对象的静态/动态转换

Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){} 

我想我现在已经有了进一步的认识指针和感谢引用到very good answer这里计算器铸造的,但现在有介入的对象。当引用被转换为对象时究竟发生了什么?或者,如果p_derived是对象本身而不仅仅是一个引用呢?它会创造新的对象吗?如果是的话,这些会如何被立即执行?

我也很惊讶这可以编译,因为在Base.h中找到了这个代码,Derived只是前向声明的意思,它不应该知道它实际上是从Base派生的。我试图在另一个地方做一个从Derived *到Base *的静态类型转换,但是由于类型与该转换单元有关不兼容,所以它不会被编译。

回答

3

当您使用引用时,通常实际上使用它引用的对象。这就是你用指针得不到的参考语法的神奇透明度;可以说这是他们存在的理由。

这种情况也不例外:你服用的p_derived裁判并通过切片构建新的Base出来。如果这就是你所追求的(即使它不是:P),你也可以参考

我也感到惊讶,因为在Base.h中可以编译这个代码,Derived只是前向声明的意思,它不应该知道它实际上是从Base派生的。

是的,这也让我感到惊讶。你确定? (Demo/Demo - 不确定你在使用哪一个)

+0

所以你说“static_cast (d)”,无论d是引用还是对象,基本上都与“Base b; b = d;”在这种情况下?不,它更像这样:http://codepad.org/8bn2MxAl – user1130005 2012-01-17 10:10:14

+0

@ user1130005:这就是我所说的。你想用这些代码实现什么?为什么不'm_state(static_cast (p_derived.m_state.get()))'或类似? – 2012-01-17 10:21:45

+0

是的,我应该明确地解决它。我有几个派生自Base的类,它用作派生类之间共享状态的接口,这就是为什么我需要传入一个对象(可能Base和会更好),以获取它对Base的私有状态。我试图将Java代码转换为C++,Java允许各种疯狂的依赖关系。这就是我遇到这些问题的原因。至于为什么允许static_cast,我仍然好奇。它允许在C++中执行“A a; B b; a = b;”即使A和B没有共同之处? – user1130005 2012-01-17 10:47:35