将派生类的指针成员转换为基类的指针成员

时间:2015-11-30 13:09:04

标签: c++ pointers member

我知道这是一种可怕的做法,但仍然在疑惑。 当我将派生类的指针成员转换为基类的指向成员时,如下所示:

struct A
{
    void foo(){};
};

struct B: A
{
    void bar(){}
};

int main()
{
    void (A::*p)() = (void (A::*)())(&B::bar); // shit
    return 0;
}

编译器(clang,gcc)给了我错误,这是正确的! 但是,如果我声明typedef是这样的:

struct A
{
    typedef void (A::*handler)();
    void foo(){};
};

struct B: A
{
    void bar(){}
};

int main()
{
    void (A::*p)() = (A::handler)(&B::bar);
    return 0;
}

没关系并且编译。为什么这个typedef会影响编译?我怀疑这应该导致UB。它是否使程序结构良好?

0 个答案:

没有答案