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&
)确实指AB
。