让我们假设有这样的类层次结构:
cl A //base cl
cl B //intece
cl C : public A, public B
然后创建 C 对象:
A *object = new C();
是否有可能将对象强制转换为 B?
重要:我假设我不知道该对象是 C。我只知道它实现了接口 B
从任何类型到任何其他类型的方法是dynamic_cast。但它要求对象是polymorphic。通常,这需要将 v 表关联到A
和B
,因此:如果 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 彼此无关。
是的,你应该首先static_cast
对象到 C *,然后你可以static_cast
它再次到 B(虽然这最后的转换是不需要的,因为是一个标准的转换)。
编辑更改问题后,不再可能执行您想要的操作。您需要知道继承树上下的正确路径,因为在具有非空类的多重继承的场景中,强制转换意味着指针的移动。
只要对象是从 B 派生的,您总是可以将对象强制转换为 B。当然,您只能调用接口 B 中定义的方法,因为虚拟指针只能访问虚拟表中 B 定义的方法。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(59条)