C++ 将指向派生类成员的指针强制转换为指向基类成员的指针

C++ 将指向派生类成员的指针强制转换为指向基类成员的指针,c++,pointers,inheritance,member,C++,Pointers,Inheritance,Member,我知道这是一个很糟糕的练习,但我仍然很好奇。 当我将指向派生类成员的指针强制转换为指向基类成员的指针时,如下所示: struct A { void foo(){}; }; struct B: A { void bar(){} }; int main() { void (A::*p)() = (void (A::*)())(&B::bar); // shit return 0; } 编译器(clang,gcc)给了我错误,这是正确的! 但如果我这样声明

我知道这是一个很糟糕的练习,但我仍然很好奇。 当我将指向派生类成员的指针强制转换为指向基类成员的指针时,如下所示:

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。它是否使程序格式良好?

您的第一个版本使用gcc编译。链接到这里。@rakeshdn,我的错。。这个问题现在无关紧要了。谢谢你的帮助!只要与它一起使用的任何
A*
(或
A&
)确实指A
B