面向对象——模块的延续与发展
模块的延续与发展
模块成员的性质和模块的性质
模块累积的角度,一个大模块是由小模块构成的。
构建一个模块有两种方式:小模块架构成为大模块,由另一个模块继承和派生而来
模块可以通过调用模块成员使用模块成员的性质,这就是组合。
代码理解如下:
#include<bits/stdc++.h>
using namespace std;
class point{
private:
int x,y;
public:
point(int xx,int yy):x(xx),y(yy){}
void showpoint(){
cout<<"("<<x<<","<<y<<")"<<endl;
}
~point(){}
};
///小模块组合为大模块
class circle{
public:
point p;
double r;
public:
circle(int xx,int yy,double rr);
double getarea(){return 3.14*r*r;}
void shouarea(){
cout<<"S="<<getarea()<<endl;
}
};
///构造函数
circle::circle(int xx,int yy,double rr):p(xx,yy),r(rr){}
int main(){
circle c(3,4,5.1);
c.shouarea();
(c.p).showpoint();
return 0;
}
继承意义与派生模块构造
模块除了组合关系,还有继承关系,简要的说就是把父模块的功能性质直接作为自己的功能性质。
如果一个派生模块只继承了一个基类模块,称为单继承;如果一个派生模块继承了多个基类模块作为自己的子成员,这种继承关系成为多继承。
派生类模块的构造是在已有模块的基础上发展起来的,即派生类模块继承了基类模块的接口功能。
派生模块继承了基类模块,也就是说基类模块是派生模块的一部分,在构造派生模块时当然要构造一个基类模块作为他的子成员。
继承关系
通常涉及到以下两点:1.一个基类模块(父模块)是派生模块的一个构造成员
2.基类模块(父模块)的接口成员在子模块里的访问权限问题。
公有继承关系:派生类把继承下来的基类的接口成员也作为自己的对外接口,从外部来看派生类也具有了基类的性质。
语法如下:
class 派生类名 : public 基类名{
成员说明列表
}
派生类名是指的新构造的模块,基类名是基础模块,派生类是以基类为基础发展形成的;
public表示的是基类的接口被继承到派生模块后将被提升成为派生类的对外接口
成员说明列表指的是派生模块中除了继承模块外新加的成员。
#include<bits/stdc++.h>
using namespace std;
class base{
private:
int b_num;
public:
///无参构造函数
base(){}
///有参构造函数
base(int i):b_num(i){}
int getbnum(){return b_num;}
int setnum(int x){b_num=x;}
void showbnum(){cout<<b_num<<endl;}
~base(){}
};
///定义的继承派生关系,没有添加新成员
///公有继承,基类的对外接口继承下来成为派生类的对外接口
class derived:public base{
};
int main(){
cout<<"测试基类性质"<<endl;
base b;
cout<<b.getbnum()<<endl;
b.setnum(500);
cout<<b.getbnum()<<endl;
cout<<"基类base的对象大小为"<<sizeof(b)<<endl;
cout<<"测试派生类性质"<<endl;
derived d;
cout<<d.getbnum()<<endl;
d.setnum(555);
cout<<d.getbnum()<<endl;
cout<<"派生类derived的对象大小为"<<sizeof(d)<<endl;
return 0;
}
保持原有访问属性,私有还是私有:
#include<bits/stdc++.h>
using namespace std;
class A{
private: int a;
public: int puba;
public:
void showa(){cout<<a<<endl;}
int geta(){return a;}
};
class B{
private: int b;
public: int pubb;
public:
void showb(){cout<<b<<endl;}
int getb(){return b;}
};
///公有继承下类C有6个接口成员
class C: public A, public B{
};
int main(){
C e;
cout<<e.geta()<<endl;
cout<<e.puba<<endl;
cout<<e.getb()<<endl;
cout<<e.getb()<<endl;
e.showa();
e.showa();
return 0;
}