为什么我不能将指向派生类的指针强制转换为引用指向基类的指针?
struct Base { };
struct Derived : Base { };
int main()
{
Derived* derived = nullptr;
static_cast<Base*&>(derived);
}
我明白了:
invalid static_cast from type 'Derived*' to type 'Base*&'
答案 0 :(得分:3)
根据你的评论:
&#34;不,这不是一个学术问题。我需要调用一个函数作为参数Base*&
&#34;
解决此问题的正确方法是创建一个适当类型的新指针变量,并将其(或更确切地说,对它的引用)传递给相关函数:
struct Base { };
struct Derived : Base { };
int main()
{
Derived* derived = nullptr;
Base* base = static_cast<Base*>(derived);
my_function(base); // takes a Base*& argument
// If you need the pointer value and are sure that
// it's a Derived* type:
derived = static_cast<Derived*>(base);
}
请注意,如果您在问题本身中包含相关信息(来自我上面引用的评论),您很可能会很快收到此答案。
答案 1 :(得分:1)
由于Derived*
对象不是Base*
对象,并且它们完全可能,因此两者可以具有不同的内存布局或值表示(如果Base
的对齐要求例如,Derived
不同。由于其中一个不是另一个,static_cast
无法执行转换。
如果您知道自己在做什么并且知道类型双关语是正常的,请使用该工具进行类型惩罚 - reinterpret_cast
:
reinterpret_cast<Base*&>(derived);
并注意滥用的任何后果(与reinterpret_cast
一样)。请特别注意,根据C ++ 11 3.10 / 10,就标准而言,通过演员表的结果进行的任何访问都将是Undefined Behavior(尽管您的编译器可能提供更强的保证)。
请注意,在一般情况下,从Derived*
到Base*
的演员表不一定是无操作。例如,如果涉及多重继承,则可能涉及地址转换。
答案 2 :(得分:-1)
仅适用于您的错误 改变这个
static_cast<Base*&>(derived);
to
static_cast<Base*>(derived);
^^
答案 3 :(得分:-1)
如果你想要一个你需要的参考
Base* ptr = static_cast<Base*>(derived);
Base &ref = *ptr;
你不能指向一个引用 - 它们是完全不同的东西