将指针强制转换为派生类以引用指向基类的指针

时间:2015-01-16 15:29:37

标签: c++ pointers casting reference

为什么我不能将指向派生类的指针强制转换为引用指向基类的指针?

struct Base { };
struct Derived : Base { };

int main()
{
    Derived* derived = nullptr;
    static_cast<Base*&>(derived);
}    

我明白了:

invalid static_cast from type 'Derived*' to type 'Base*&'

4 个答案:

答案 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);
                ^^

请参阅此处http://ideone.com/1QuMLK

答案 3 :(得分:-1)

如果你想要一个你需要的参考

Base* ptr = static_cast<Base*>(derived);
Base &ref = *ptr;

你不能指向一个引用 - 它们是完全不同的东西