【问题标题】:c++ multiple-inheritance [duplicate]c ++多重继承[重复]
【发布时间】:2010-01-28 22:53:14
【问题描述】:

可能的重复:
C++ pointer multi-inheritance fun.
more c++ multiple inheritance fun

这是一个处理引用计数指针基类和线程乐趣的问题。

给定:

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 以获得 C 的 B & A 部分?

如何写AtoC和BtoC来取回原来的C?

谢谢!

为什么要关闭投票?

我之前的两个问题询问某件事是否有效(答案是“否”);这个问题问“什么是进行指针转换的有效方法。”

【问题讨论】:

标签: c++ multiple-inheritance


【解决方案1】:

你不需要任何函数,因为C只从A和B派生一次。除非你从A或B多次派生(没有虚拟继承),你只需要使用:

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

AtoC 和 BtoC 仅通过以下方式安全:

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

【讨论】:

  • 那么 pbb 和 pba 不会指向同一个地方吗?如果是这样,它怎么可能既是“A”又是“B”?
  • 他们不会指向同一个地方。编译器确切地知道在将 C* 转换为 A*/B* 时将它们移动多少。你可以打印指针/反汇编来验证。
  • 在这件事上我其实对你有点挑战,如果你有兴趣的话:cplusplus.co.il/2010/01/20/a-question-of-memory-layout
  • 您不能将dynamic_cast 用于非多态基类的向下转换。你的演员阵容不正确。在这种特定情况下,只能使用static_cast
  • 你是对的,他们至少需要一个虚函数(在这种情况下,析构函数是一个完美的候选者)。不过,正如我所说,如果可能,最安全的方法是通过 dynamic_cast。他可以使用 static_cast,但这需要事先知道它必须成功。
【解决方案2】:

要获得 C 的 B & A 部分,您可以尝试:

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

这应该是安全的。

【讨论】:

  • 要走另一个方向,我必须动态投射吗?
  • 我刚刚注意到,这是要求 2x 只是标题不同:)
  • 是的,以另一种方式使用动态演员表。
猜你喜欢
  • 2015-07-30
  • 2020-06-08
  • 1970-01-01
  • 2011-05-28
  • 2011-08-22
  • 2013-10-24
  • 2012-06-02
  • 2012-05-14
  • 2013-08-28
相关资源
最近更新 更多