C++函数重载问题,大一小白不太懂

virtual void f(int *p){
}
virtual void f(const int *p){

}

virtual void f(int *p){
}
virtual void f( int *const p){
}

请问前面一个为什么是函数重载而后一个不是

class X
{
public:
X( int val ): j( val ), i( j ) { }//请问为何给val赋值4,输出时是j=4,i=0;
// ...
private:
int i;
int j;
};

一个是修饰指针值本身,一个是修饰参数类型,当然只有参数类型不同才可以构成重载啊

应该说的是子类重载父类的两个函数,然后后一个不算吧……
因为int const*
const int*
不是一个类型啊