2010-01-28 109 views
1

可能显示的文件:
C++ pointer multi-inheritance fun.
more c++ multiple inheritance funC++多继承

这是从与参考计数指针基类处理和线程乐趣出现的一个问题。

考虑:

class A{int x, y;}; 
class B{int xx, yy;}; 
class C: public A, public B {int z;}; 
C c; 
C* pc = &c; 
B* pb = CtoB(pc); 
A* pa = CtoA(pc); 

assert(pc == AtoC(pa)); 
assert(pc == BtoC(pb)); 

我怎样写CtoB和CTOA得到的B &℃的部分?

如何我写ATOC和BtoC的找回原来的C?

谢谢!

为何选票关闭?

我以前的两个问题问什么是有效的(答案是“否”);这个问题问“什么是做指针转换的有效方法”。

+0

您是否真的需要第三个相同主题的问题? http://stackoverflow.com/questions/2158512/more-c-multiple-inheritance-fun和http://stackoverflow.com/questions/2157104/c-pointer-multi-inheritance-fun – Trent 2010-01-28 22:56:29

回答

3

你不需要任何功能,除非你从A点或B多次(不包括虚拟继承)派生而来,因为仅C从A和B派生一次,你只需要使用:

A *pbb = pc; 
B *pba = pc; 

AtoC和BtoC只能通过以下方式安全使用:

C *c = dynamic_cast<C*>(a_or_b_pointer); 
+0

那么pbb和pba不会指向同一个地方吗?如果是这样,它怎么可能是“A”和“B”? – anon 2010-01-28 23:04:44

+0

他们不会指向同一个地方。编译器完全知道在将C *转换为A */B *时将其转移多少。你可以打印指针/反汇编来验证。 – rmn 2010-01-28 23:05:51

+0

其实,我在这个问题上给你一个小的挑战,如果你有兴趣:http://cplusplus.co.il/2010/01/20/a-question-of-memory-layout/ – rmn 2010-01-28 23:08:19

1

才能获取C中的B &的零件,你可以尝试:

B* pbb = static_cast<B*>(pc); 
A* pba = static_cast<A*>(pc); 

这应该是安全的。

+0

要转到另一个方向,我必须动态投射吗? – anon 2010-01-28 23:02:19

+0

我刚刚注意到,这是要求2x只是与不同的标题:) – sinek 2010-01-28 23:03:01

+0

是的,去用另一种方式,你会使用动态演员。 – 2010-01-28 23:05:24