在派生类中,存在第四种访问权限:不可访问。
4.3.1公有继承
赋值兼容原则:在公有继承情况下,一个派生类的对象可以作为基类的对象使用。
分为以下三种情况:
- 派生类的对象可以赋给基类的对象
- 派生类的对象可以初始化基类的引用
DerivedClass d;
BaseClass& br=d;
- 派生类的对象地址可以赋给基类的指针
DerivedClass d;
BaseClass * pr=&d;
后两种情况下,通过br或pr只能访问对象d中所继承的基类成员【这是由基类的类定义决定的】
4.3.2私有继承
将继承方式改为私有继承后,movexy()性质发生了改变(从派生类的公有成员变为私有成员),导致c.movexy(7,8)无法被外模块所使用,于是需要在派生类中增加新的外部接口,操作如下:
#include<iostream>
using namespace std;
class Point//定义基类
{
public:
void setxy(int myx,int myy)
{
X=myx;
Y=myy;
}
void movexy(int x,int y)
{
X+=x;
Y+=y;
}
protected:
int X,Y;
};
class Circle:private Point//定义派生类,公有继承方式
{
public:
void setr(int myx,int myy,int myr)
{
setxy(myx,myy);
R=myr;
}
void movexy(int x,int y)//增加新的外部接口
{
Point::movexy(x,y);
}
void display();
protected:
int R;
};
void Circle::display()
{
cout<<"The position of center is";
cout<<"("<<X<<")"<<Y<<")"<<endl;
cout<<"The radious of Circle is"<<R<<endl;
}
int main()
{
Circle c;//派生类对象
c.setr(4,5,6);//派生类对象访问自己的成员函数
cout<<"The start data of Circle:"<<endl;
c.display();
c.movexy(7,8);
cout<<"The new data of Circle:"<<endl;
c.display();
return 0;
}
4.3.3保护继承
这也没啥好讲的,给个图记住就成。