从基类到不同派生类的多重继承强制转换(the inheritance games show cast)

让我们假设有这样的类层次结构:

让我们假设有这样的类层次结构:

cl A //base cl
cl B //intece
cl C : public A, public B

然后创建 C 对象:

A *object = new C();

是否有可能将对象强制转换为 B?

重要:我假设我不知道该对象是 C。我只知道它实现了接口 B

21

。这是不可能的(从A*B*的直接铸造)。

因为AB的地址在cl C中的不同位置。因此,强制转换将始终不安全,并且您可能会遇到意外行为Demo

强制转换应始终通过cl C。例如

A* pa = new C();
B* pb = static_cast<C*>(pa);
                   ^^^^ go through cl C
Demo
11

从任何类型到任何其他类型的方法是dynamic_cast。但它要求对象是polymorphic。通常,这需要将 v 表关联到AB,因此:如果 A 和 B 至少有一个虚函数,并且 RTTI 不是,则禁用

A* pa1 = new C;
A* pa2 = new A;
B* pb1 = dynamic_cast<B*>(pa1);
B* pb2 = dynamic_cast<B*>(pa2);

将导致 pb2 为 null,并且 pb1 指向包含 * pa1 作为其 A 部分的对象的 B 部分(它是 C 或从这两个基础派生的任何其他事实并不重要)。

否则,所有需要是静态的,你必须通过 C

B* pb = static_cast<B*>(static_cast<C*>(pa));

请注意,static_cast<B*>(pA)无法编译,因为 A 和 B 彼此无关。

3

是的,你应该首先static_cast对象到 C *,然后你可以static_cast它再次到 B(虽然这最后的转换是不需要的,因为是一个标准的转换)。

编辑更改问题后,不再可能执行您想要的操作。您需要知道继承树上下的正确路径,因为在具有非空类的多重继承的场景中,强制转换意味着指针的移动。

0

只要对象是从 B 派生的,您总是可以将对象强制转换为 B。当然,您只能调用接口 B 中定义的方法,因为虚拟指针只能访问虚拟表中 B 定义的方法。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(256)
如何在VisualStudioReact项目中使用纱线而不是npm
上一篇
与 React-Router的活动链路
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(59条)