- 保持已有类的特性而构造新类的过程称为继承,在已有类的基础上新增自己的特性而产生新类的过程称为派生,被继承的已有类称为基类(或父类),派生出的新类称为派生类。
- 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。
派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。
- 实例举例
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;
};
#include<iostream>
#include<cmath>
using namecpace std;
int main()
{ Rectangle rect;
rect.InitR(2,3,20,10);
//通过派生类对象访问基类公有成员
rect.Move(3,2);
cout<<rect.GetX()<<','
<<rect.GetY()<<','
<<rect.GetH()<<','
<<rect.GetW()<<endl;
return 0;
}
- 私有继承
- 基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。
- 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
- 通过派生类的对象不能直接访问基类中的任何成员。
- 私有继承举例
class Rectangle: private Point //派生类声明
{public: //新增外部接口
void InitR(float x, float y,float w, float h)
{InitP(x,y);W=w;H=h;} //访问基类公有成员
void Move(float xOff, float yOff) {Point::Move(xOff,yOff);}
float GetX() {return Point::GetX();}
float GetY() {return Point::GetY();}
float GetH() {return H;}
float GetW() {return W;}
private: //新增私有数据
float W,H;
};
#include<iostream>
#include<cmath>
using namecpace std;
int main()
{ //通过派生类对象只能访问本类成员
Rectangle rect;
rect.InitR(2,3,20,10);
rect.Move(3,2);
cout<<rect.GetX()<<',' <<rect.GetY()<<','
<<rect.GetH()<<','<<rect.GetW()<<endl;
return 0;
}
- 保护继承
基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员对建立其所在类对象的模块来说,它与 private 成员的性质相同。对于其派生类来说,它与 public 成员的性质相同。保护继承举例:
class A{
protected:
int x;
}
int main()
{
A a;
a.x=5; //错误
}
class A {
protected:
int x;
}
class B: public A{
public:
voidFunction();
};
void B::Function()
{
x=5; //正确
}