类的共有成员和保护成员被继承后作为派生的保护成员。类的私有成员在派生成员中不能被直接访问,即派生类的其他成员函数可以直接访问基类的共有成员和保护成员,但是在类外部通过派生类的对象无法访问他们。同样无论是派生类的成员还是通过派生类的对象都无法访问从基类继承的私有成员。
为了进一步说明保护继承和保护成员的访问性,将基类Point的数据成员X,Y的属性使用protected然后又增加一个派生类Cylindder(圆柱体)Cylinder保护继承Circle,程序实现如下:
首先先编写一个基类point,其功能包括:找圆心和圆心的移动。
#include <iostream>
using namespace std;
class Point //定义一个类
{
private:
int X,Y; //定义两个私有成员作为圆心
public:
Point(int X = 0,int Y = 0) //构造函数
{
this ->X = X,this ->Y = Y;
}
void move(int offX,int offY) //该函数作为圆心的移动
{
X += offX,Y += offY;
}
void ShowXY()
{
cout<<"("<<X<<"."<<Y<<")"<<endl;
}
};
编写完point基类将它保存,因为只有先保存这样在之后编写其他的程序的时候才可以直接调用,这也是节省时间的一个号方法,但一定要保证两个程序的保存路径是一致的不然的话就有可能在第二个程序的头文件中编译器找不到该文件。
#include "Point.h"
const double PI = 3.14159;//指定数据常量
class Circle:protected Point //新定义类的保护继承Point
{
protected:
double radius; //定义半径为私有成员
public:
Circle(int R,int X,int Y):Point(X,Y)//新的构造函数需要包括所有的量
{
radius = R;
}
double area() //求圆的面积
{
return PI*radius*radius;
}
void ShowCircle() //展示圆的圆心和半径
{
cout<<"Center of circle:";
ShowXY();
cout<<"Radius:"<<radius<<endl;
}
};
class Cylinder:protected Circle //新定义类,为保护继承Circle
{
private:
double height; //定义圆柱高为私有成员
public:
Cylinder(int X,int Y,double R,double H):Circle(R,X,Y) //新的构造函数
{
height = H;
}
double area() //求圆柱的表面积
{
return 2*Circle::area() + 2*PI*radius*height;
}
double volume() //求圆柱体积
{
return Circle::area()*height;
}
void ShowCylinder()
{
ShowCircle();
cout<<"Height of cylinder:"<<height<<endl;
}
};
int main()
{
Cylinder CY(100,200,10,50);
CY.ShowCylinder();
cout<<"total area:"<<CY.area()<<endl;
cout<<"volume:"<<CY.volume();
return 0;
}
在该程序中要注意的是:在基类的公有成员和保护成员在被保护继承之后成为了派生类的保护成员,而私有成员是不变的,因此在派生类中,成员函数不能够直接访问父类的私有成员。
运行结果: