面向对象(四)——继承

1.类之间的继承

类的一个重要的特征是继承,这使得我们可以基于一个类生成另外一个类的对象,以便使后者拥有前者的某些成员,再加上自己的一些成员。

由其他类引申而来的子类继承基类的所有可视成员。意思是说,如果一个基类包含成员A,而我们将它引申为另一个包含成员B的类,这个子类同时包含A和B
定义一个子类,必须在子类的申明中使用冒号操作符“:”,如下所示:
class derived_class : public base_class
子类名称:访问权限(可以是public、protected、private)基类名称,但是一般的继承访问权限一般是public

#include <iostream>
using namespace std;
class Cfather{
protected:
    int wigth,height;
public:
    void get_vaule(int,int);
};
class Triangle:public Cfather{  //继承
private:
        int x, y;
public:
    int area1(void);
    Triangle operator +(Triangle);  //运算符重载
    friend class Rectangle;
};
class Rectangle:public Cfather
{
public:
    int area(void);
};
void Cfather::get_vaule(int a, int b)
{
    wigth=a;
    height=b;
}
int Rectangle::area(void)
{
    return (wigth*height);
}

int Triangle::area1(void)
{
    return (wigth*height/2);
}
Triangle Triangle::operator +(Triangle param){
    Triangle overload;
    overload.wigth=wigth+param.wigth;
    overload.height=height+param.height;
    return (overload);
}
int main()
{
   Rectangle rec;
   rec.get_vaule(4,5);
   Triangle tri,tri1,tri2;
   tri1.get_vaule(2,2);
   tri.get_vaule(3,4);
   tri.get_vaule_d(4,5);
   tri2=tri1+tri;
   cout<<tri.area1()<<" "<<rec.area()<<'\n'
      <<tri2.area1()<<endl;
}

如上代码所示,Rectangle和Triangle的每一个对象都包含了Cfather的成员,即width,height和get_value
标识符protected和private类似,唯一区别在于继承。当定义一个子类的时候,基类的protected成员可以被子类的其它成员所使用,然而private成员就不可以。

不同访问权限类型:
一个类的:public,protected,private;该类里面的成员可以访问所有成员;子类可以访问public和protected;而外部成员只能访问public(所以这是接口的问题)

对于继承访问权限的问题,在上面我们使用的是 class Triangle:public class Cfather,就是说当类Triangle从Cfather继承来的成员相当于在Triangle的public中增加了这些成员,则外部可以访问到从基类继承下来的成员,如果不想使外部访问子类从基类继承下来的成员的话,可以适当改成 class Triangle:protected/private Cfather 这样子。

一般而言,如果没有申明,那么通过class申明的默认为private,通过struct申明的默认为public。

2.什么是从基类继承

理论上讲,子类继承了基类的所有成员,除了:
1.构造函数和析构函数();
2.operator = ();操作符重载,重载函数
3.friends ; 友元类

实际上,子类中的一个对象被创建或者销毁的时候,都会自动调用基类的默认构造函数和析构函数。
如果基类没有默认构造函数,或你希望当子类生成新的对象时,调用基类的某个重载函数,则可以指定它:
Triangle(参数):base (参数){}

3.多重继承

在C++中,一个class可以从多个class中继承属性或函数,只需要在子类的申明中用逗号将不同基类分开就可以了。
如果我们有一个特殊的class Coutput可以实现向屏幕打印的功能,同时希望类CRectangle和CTriangle在又从CPolygon之外继承一些成员,那么我们有:
class CRectangle:class Couput,class CPolygon {}
class CTriangle:class Couput,class CPolygon {}

如下代码所示,并附上解释:

#include <iostream>
using namespace std;
class Cfather{    //申明Cfather类
protected:
    int wigth,height;
public:
    void get_value(int,int);
};

void Cfather::get_value(int i, int j)   //对函数进行定义
{
    wigth=i;
    height=j;
}
 
class Coutput{    //申明Coutput类
public:
    void output(int a){cout<<a<<endl;}   //内联函数
};

class Ctriangle:public Cfather,public Coutput{      //类Ctriangle既继承了Cfather类也继承了Coutput类
public:
    int area(void){return(wigth*height/2);}  //内联函数
};

class Crectangle:public Cfather,public Coutput{
public:
    int area1(void){return(wigth*height);}  //内联函数
};

int main()
{
    Ctriangle tri;
    tri.get_value(3,4);
    Crectangle rect;
    rect.get_value(3,2);
   tri.output(tri.area());
   rect.output(rect.area1());
    return 0;
}
输出 6 , 6

4.公有继承、保护继承和私有继承

1) public继承方式

基类中所有public成员在派生类中为public属性;
基类中所有protected成员在派生类中为protected属性;
基类中所有private成员在派生类中不可访问。

2) protected继承方式

基类中的所有public成员在派生类中为protected属性;
基类中的所有protected成员在派生类中为protected属性;
基类中的所有private成员在派生类中仍然不可访问。

3) private继承方式

基类中的所有public成员在派生类中均为private属性;
基类中的所有protected成员在派生类中均为private属性;
基类中的所有private成员在派生类中均不可访问。
一、实验目的 掌握根据实际需求设计Java类的方法; 掌握Java中继承的使用方法; 掌握Java中package的概念和使用方法; 掌握静态方法的定义和使用方法; 掌握Object类中equals方法和toString方法的覆盖方法。 二、实验内容 1、设计一个名为figure的图形软件包(package)。包中包含三角形、矩形、圆三个类。要求:(1)每个类都要构造方法并为成员设置get和set方法;(2)每个类都要有计算周长和面积的成员方法;(3)完成该软件包后的编码后,在另一个包的含有main方法的类中编写代码,分别使用图形软件包中的三个类,生成三个对象,并打印出其周长和面积。 2、编写类Factorial,为其添加两个静态方法(方法名自定义)。其中一个使用递归计算n的阶乘,一个使用非递归计算n的阶乘。构造main方法进行测试。 3、按照要求使用Java进行编码。 设计一个教师类Teacher,属性有编号(no)、姓名(name)、年龄(age)、所属学院(seminary),为这些属性设置相应的get和set方法; 为Teacher类重写equals方法;(当两个教师对象的no相同时返回true) 重写Teacher类的toString方法,通过该方法可以返回“编号为**、姓名为**、年龄为**的**学院老师”形式的字符串。 构造main方法进行测试。 4、设计一个带表头的单链表(链表中的元素属于同一类型对象,但对象的类型可以随意),提供以下操作:(1)insert:在某个位置插入对象;(2)delete:在某个位置删除对象;(3)delete:删除链表中与x相同的元素;(4)size:返回当前链表中对象的个数;(5)isEmpty:判断链表是否为空;(6)traverse:遍历链表,打印出所有的元素;(7)getData:取得某个位置的对象。构造main函数进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值