Cast function pointers that differs by argument type
问题 Why this is not legal: class Base { public: Base(){}; virtual ~Base(){}; }; class Derived : public Base{}; void takeDerived(Derived * c){}; // main void(*ptr)(Base*) = static_cast<void(*)(Base*)>(&takeDerived); // doesn't work // but this work ok, as well as reinterpret_cast // void(*ptr)(Base*) = (void(*)(Base*))(&takeDerived); Derived is a Base . Why can't it be casted in function parameter? For example, I can do this easily even without casting: void takeBase(Base* c){}; takeBase(new