c++中的一个小疑点

c++中的一个小问题
我写了一个很简单的小程序,但是其中有几处不解之处,请高手指点:
#include<iostream.h>
class base
{
protected: //如果此处改成private将会是错误的,为什么??
int x;
public:
base(int a)
{
x=a;
}
void who()
{
cout<<"base"<<x<<endl;
}
};
class derive1:public base
{
public:
derive1(int a):base(a) //此处的构造函数是怎么赋值的???
{
}
void who()
{
cout<<"derive1"<<x<<endl;
}

};
class derive2:public base
{
public:
derive2(int a):base(a)
{

}
void who()
{
cout<<"derive2"<<x<<endl;
}
};
void main()
{
base *p;
base obj(1);
derive1 obj1(2);
derive2 obj2(3);
p=&obj;
p->who(); //为什么以下的三个输出都是输出base的成员函数???
p=&obj1;
p->who();
p=&obj2;
p->who();
}

------解决方案--------------------
protected: //如果此处改成private将会是错误的,为什么?? 
如果是私有的,则子类不能访问变量x

derive1(int a):base(a) //此处的构造函数是怎么赋值的??? 
子类在构造时,先调用父类的构造函数

p->who(); //为什么以下的三个输出都是输出base的成员函数??? 
父类的who函数不是虚的
------解决方案--------------------
1)派生类只能访问public 和 protected成员
2)派生类构造的时候先构造基类
3)who函数不是virtual的,不具有多态