为什么不允许这种交叉投射?
Why is this cross-cast not allowed?
考虑这个简单的例子:
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
可以在没有 RTTI (dynamic_cast
) 的情况下从 Derived
到达并让我做:
Derived* foo3 = static_cast<Derived*>(foo1);
Base2* foo2 = foo3;
为什么不允许这样做? (有人可能会争辩说,编译器不知道 foo1
是否属于 Derived
类型,但是 static_cast
无论如何都不会检查类型,即使从 Base1
转换为 Derived
例如)
注意:这个question和我的很像,但是不太一样,因为这里我们是交叉铸造基础类,不是派生的
A static_cast
将失败,因为非正式地说,Base1
和 Base2
不相关。
但是,如果您的 类 是 多态的 ,则 dynamic_cast
将起作用:您可以通过添加虚拟析构函数来实现:
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);
}
从 Base1
到 Base2
的转换在使用 composition(即接口)时是惯用的。
考虑这个简单的例子:
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
可以在没有 RTTI (dynamic_cast
) 的情况下从 Derived
到达并让我做:
Derived* foo3 = static_cast<Derived*>(foo1);
Base2* foo2 = foo3;
为什么不允许这样做? (有人可能会争辩说,编译器不知道 foo1
是否属于 Derived
类型,但是 static_cast
无论如何都不会检查类型,即使从 Base1
转换为 Derived
例如)
注意:这个question和我的很像,但是不太一样,因为这里我们是交叉铸造基础类,不是派生的
A static_cast
将失败,因为非正式地说,Base1
和 Base2
不相关。
但是,如果您的 类 是 多态的 ,则 dynamic_cast
将起作用:您可以通过添加虚拟析构函数来实现:
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);
}
从 Base1
到 Base2
的转换在使用 composition(即接口)时是惯用的。