0

考虑这个简单的例子:

struct Base1 {};

struct Base2 {};

struct Derived : public Base1, public Base2 {};

int main()
{
   Derived foo;
   Base1* foo1 = &foo;
   Base2* foo2 =  static_cast<Base2*>(foo1); 
}

我得到:

Error: static_cast from 'Base1 *' to 'Base2 *', which are not related by inheritance, is not allowed

编译器应该有足够的信息来确定Base2可以在Derived 没有 RTTI ( dynamic_cast) 的情况下获得这些信息并让我这样做:

Derived* foo3 = static_cast<Derived*>(foo1);
Base2* foo2 = foo3;

为什么不允许这样做?(有人可能会争辩说编译器不知道是否foo1Derived类型,但即使从转换为例如static_cast也不检查类型)Base1Derived

注意:这个问题与我的类似,但并不完全相同,因为这里我们是交叉转换基类,而不是派生类

4

1 回答 1

3

Astatic_cast将失败,因为非正式地说,Base1并且Base2不相关。

但是,dynamic_cast如果您的类是多态的,则 a 将起作用:您可以通过添加虚拟析构函数来实现:

struct Base1 {virtual ~Base1() = default;};

struct Base2 {virtual ~Base2() = default;};

struct Derived : Base1, Base2 {};

int main()
{
   Derived foo;
   Base1* foo1 = &foo;
   Base2* foo2 =  dynamic_cast<Base2*>(foo1); 
}

在使用组合(即接口)时,这种从Base1to的转换Base2是惯用的。

于 2020-01-06T07:59:53.297 回答