1、公有继承
当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。---也就是说基类的公有成员和保护成员被继承到派生类中访问属性不变,仍作为派生类的公有成员和保护成员,派生类的其他成员可以直接访问他们。在类族之外只能通过派生类的对象访问从基类继承的公有成员,而无论是派生类的成员还是派生类的对象都无法直接访问基类的私有成员。
eg:
point类公有继承。
在这个例子中从point类派生出新的Rectangle(矩形)类。矩形是由一个点加上长、宽构成,矩形的点具备了point类的全部特征,同时矩形自身也有一些特点,这就需要在继承point类的同时添加新的成员。
程序的头文件部分
//Rectangle.h
class Point //基类Point类的定义
{
public:
void InitP(float xx=0,float yy=0){X=xx;Y=yy;}
void Move(float xOff,float yOff){X+=xOff;Y+=yOff;}
float GetX(){return X;}
float GetY(){return Y;}
private:
float X,Y;
};
class Rectangle:public Point //派生类定义部分
{
public: //新增公有函数成员
void InitR(float x,float y,float w,float h)
{InitP(x,y);W=w;H=h;} //调用基类公有成员函数
float GetH(){return H;}
float GetW(){return W;}
private: //新增私有数据成员
float W,H;
};
//End of Rectangle.h
首先定义了基类point,派生类Rectangle继承了point类的全部成员
因为继承方式为公有形式,故基类中的公有成员在派生类中访问属性保持原样,派生类的成员函数集对象可以访问到基类的公有成员。基类原有的外部接口变成了派生类的外部接口的一部分。当然派生类自己新增的成员之间都是可以相互访问的。
下面是程序的主函数部分
#include<iostream>
#include<cmath>
#include"rectangle.h"
using namespace std;
int main()
{
Rectangle rect;//声明Rectangle类的对象
rect.InitR(2,3,20,10);//设置矩形的数据
rect.Move(3,2);//移动矩形位置
cout<<"The data of rect(X,Y,W,H):"<<endl;
cout<<rect.GetX()<<","
<<rect.GetY()<<","
<<rect.GetW()<<","
<<rect.GetH()<<endl;
}
2、私有继承