The real answer is probably "because the language specification says you cannot", however think about what you are trying to do:
bool (IBaseA::*ptr)(std::string&) = &BaseA::sayHello;
Essentially, it reads like: I want the ptr variable, which is a pointer to an IBaseA member function, and I want it to point to the sayHello method in BaseA.
Yes, the sayHello method in BaseA overrides the value in IBaseA, but they are still different methods. Imagine if you tried to use a pointer to call a method on an object of type IBaseA, which was not actually BaseA - this is syntactically allowed, but what do you expect?
In other words, taking a pointer to a member of a derived class and assigning it to a variable declared a dot in a member of the base class will violate the security of the static type.
source share