And*_*rew 15 c++ casting multiple-inheritance
我们假设有这样的类层次结构:
class A //base class
class B //interface
class C : public A, public B
Run Code Online (Sandbox Code Playgroud)
然后创建C对象:
A *object = new C();
Run Code Online (Sandbox Code Playgroud)
可以将对象转换为B吗?
重要提示:我假设我不知道该对象是C.我只知道它实现了接口B.
iam*_*ind 14
不.这是不可能的(从直接铸造A*到B*).
因为地址A和B位于不同的位置class C.演员阵容总是不安全,可能会出现意想不到的行为.演示.
铸造应该经常进行class C.例如
A* pa = new C();
B* pb = static_cast<C*>(pa);
^^^^ go through class C
Run Code Online (Sandbox Code Playgroud)
从任何类型到任何其他类型的方式是dynamic_cast.但它要求对象具有多态性.一般地,这需要将相关联的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);
Run Code Online (Sandbox Code Playgroud)
将导致pb2为null,并且pb1指向包含*pa1作为其A部分的对象的B部分.(它是C或其他任何来自这两个碱基的事实并不重要).
否则,在所有需要静态的情况下,你必须通过C
B* pb = static_cast<B*>(static_cast<C*>(pa));
Run Code Online (Sandbox Code Playgroud)
注意static_cast<B*>(pA)无法编译,A和B彼此无关.