从基类到不同派生类的多重继承转换

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*).

因为地址AB位于不同的位置class C.演员阵容总是不安全,可能会出现意想不到的行为.演示.

铸造应该经常进行class C.例如

A* pa = new C();
B* pb = static_cast<C*>(pa);
                   ^^^^ go through class C
Run Code Online (Sandbox Code Playgroud)

演示

  • @Andrew,`dynamic_cast&lt;C*&gt;` 也是有效的并且可以工作(前提是类是多态的);因为`C`实际上是`A`的子类。但是,在这种情况下,`static_cast&lt;C*&gt;` 将是一个更好的主意,因为它发生在编译时。 (3认同)

Emi*_*lia 9

从任何类型到任何其他类型的方式是dynamic_cast.但它要求对象具有多态性.一般地,这需要将相关联的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);
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彼此无关.