代码改变世界

C++第四次作业

2019-10-13 18:36  jormungandlalala  阅读(168)  评论(0编辑  收藏  举报

类的继承及不同继承方式下的访问控制
一.公有继承
1.知识要点:
当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。
注意:(1)在C++的继承中,继承第一步是将基类的成员全盘接收(除构造函数与析构函数)所以讨论不同的继承方式重点是在不同继承方式的访问属性。
(2)此处说的访问一是派生类中的成员访问基类继承成员,二是在派生类外部通过派生类的对象访问基类成员
下面就通过一道例题(P256页例7-1)具体分析实验:
分析:Point类是之前写过很多次的类,而矩形是由一个点及长宽构成,那么就想到从Point类派生出Rectangle类。

include

using namespace std;
class Point{
public:
void initPoint(float x,float y){this->x=x;this->y=y;}
void Move(float xOff,float yOff){x=x+xOff;y=y+yOff;}
float getX(){return x;}
float getY(){return y;}
private:
float x,y;
};
class Rectangle:public Point{
public:
void initRectangle(float x,float y,float w,float h){
initPoint(x,y);
this->w=w;
this->h=h;
}
float getH(){return h;}
float getW(){return w;}
private:
float w,h;
};
int main()
{
Rectangle rect;
rect.initRectangle(2,3,20,10);
rect.Move(3,2);
cout<<"the data of the rect is (x,y,w,h):"<<endl;
cout<<rect.getX()<<","
<<rect.getY()<<","
<<rect.getW()<<","
<<rect.getH()<<endl;
return 0;
}
运行截图为:

二.私有继承
1.知识要点:
当类的继承方式为私有继承时,基类的公有成员以及保护成员都以私有成员出现在派生类中,而私有成员在派生类中不可直接访问。

   借用上一道题 我们将继承Point类的方式改为私有继承
   代码如下:

include

using namespace std;
class Point{
public:
void initPoint(float x,float y){this->x=x;this->y=y;}
void Move(float xOff,float yOff){x=x+xOff;y=y+yOff;}
float getX(){return x;}
float getY(){return y;}
private:
float x,y;
};
class Rectangle:public Point{
public:
void initRectangle(float x,float y,float w,float h){
initPoint(x,y);
this->w=w;
this->h=h;
}
void Move(float OffX,float OffY){Point::Move(OffX,OffY);}
float getX(){return Point::getX();}
float getY(){return Point::getY();}
float getH(){return h;}
float getW(){return w;}
private:
float w,h;
};
int main()
{
Rectangle rect;
rect.initRectangle(2,3,20,10);
rect.Move(3,2);
cout<<"the data of the rect is (x,y,w,h):"<<endl;
cout<<rect.getX()<<","
<<rect.getY()<<","
<<rect.getW()<<","
<<rect.getH()<<endl;
return 0;
}
运行结果如下:

继续分析:
由运行结果可以发现此时的结果是相同的,但是我们可以发现在此时的主函数中派生类对象所调用的函数均是派生类自身的公有函数,均是我在派生类中重新添加公有函数;
那么我如果非要用基类的公有函数呢?就像上一段代码一样
此时的结果如下:

便可说明:继承方式为私有继承时公有成员将会作为私有成员出现派生类中
三.保护继承
1.知识要点:
保护继承中,基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。
总的来说:保护继承实现了实现数据隐藏又方便实现代码重用。
class A{
protected:
int x;
};
class B:public A{
void fun();
};
void B::fun()
{
x=5;
}
此时B公有继承A,B就可访问A中的保护成员。

本节小结:
本节重要的就是掌握不同继承方式下的访问情况,掌握好便能根据具体情况正确判断所需要的继承方式。