C++编程入门(二) 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

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父类的函数会报错。

在右侧代码框中编写程序:看一下protected继承下,访问权限的变化。