Public
上一节的例子中,使用了Public的继承方式,特点为父类中每个成员的访问权限不变。也就是父类中的Public成员在子类中仍然是Public成员,父类中的Private成员在子类中仍然是Private成员,父类中的Protected成员在子类中仍然是Protected成员。效果为:子类的对象只能访问基类的Public成员,子类的成员函数能访问父类的Public成员和Protected成员。
应该不难理解,类的对象只能访问Public成员,这个是我们之前就知道的。现在Public的继承方式下,基类的Public成员在子类中仍然是Public成员,所以子类的对象能访问父类的Public成员。而类的成员函数能访问该类的所有成员,以及从父类继承来的Public和Protected成员。Public的继承方式不改变访问权限,所以子类的成员函数能访问到父类的Public、Protected成员。
继承方式中的Public与类成员的访问权限中的Public不是一个概念,两者完全没有联系。
Private使用Private的继承方式,父类中每个成员在子类中都是Private成员。所以子类对象不能访问父类中的任何成员,子类的成员函数可以访问基类的Public成员和Protected成员。
Protected
使用Protected的继承方式,父类中Public成员和Protected成员在子类中都是Protected成员,父类中Private成员在子类中还是是Private成员。所以子类对象不能访问父类中的任何成员,子类的成员函数可以访问基类的Public成员和Protected成员。
直到现在,你还没有理解怎么办?作为一个好老师,怎么允许这种事情发生!老师自制了一张图,包你学会:
#include <iostream>
using namespace std;
class Location
{
public:
void SetXY(int a,int b){x=a;y=b;}
void PrintXY(){cout<<"x= "<<x<<" y= "<<y<<endl;}
private:
int x,y;
};
class Rectangle: private Location
{
public:
void SetHW(int a,int b){h=a;w=b;}
void PrintHW(){cout<<"h= "<<h<<" w= "<<w<<endl;}
private:
int h,w;
};
void main()
{
Rectangle r;
r.SetXY(1,1); //错误
r.PrintXY(); //错误
r.SetHW(2,3);
r.PrintHW();
}
上例中,如果是Private继承的话,主函数中通过对象r父类的函数会报错。