C++类和对象的继承和派生

本文介绍C++中类的继承与派生的概念,通过一个具体的实验例子,展示了如何从现有类创建新类,并增加了新功能。新类不仅继承了基类的所有特性和行为,还扩展了额外的功能。

  在C++中,通过继承机制来实现可重用性,可以方便地利用一个已有的类建立新类,重用已有软件中的一部分甚至很大部分。一个新类从现有的类哪里获得其已有的特性,这种现象称为类的继承。也就是说,从已有的类产生一个新的类,称为类的派生。在此,已有的类称为“父类”或“基类”,新类称为“子类”或“派生类”。

  类的继承是从现有的类建立新类的方法。在建立一个新类时,编码者可以让新类继承已定义基类的所有数据成员和成员函数,而不必重新编写这些数据成员和成员函数。派生类还可以对这些数据成员和成员函数进行增加和调整,使新类具备已有类没有的一些特定功能。一个基类可以派生出多个派生类,派生类本身也可以作为基类派生出其他派生类。

  通常情况下,派生类需要添加基类没有的数据成员和成员函数。派生类比基类更具体,它代表了一组外延较小的对象,而基类则是派生类的抽象。对于单继承,派生类和基类有相同的起源。继承的巨大优势在于添加了基类所没有的特性并且改进了从基类继承来的特性。

  下面就以一个具体的实验例子在讲解C++类和对象的继承和派生。

  

实验内容:在程序设计练习中,我们创建了一个MyPoint类来建模二维空间中的一个点。MyPoint类包含了两个属性x和y,表示x轴和y轴坐标,还包含x和y的获取器函数,及返回两点之间的距离的函数。创建一个名为3DPoint的类,来建模三维空间中的一个点。将3DPoint设计为MyPoint的一个派生类,包含如下额外属性:

(1)  一个名为z的数据域,表示z轴坐标。

(2)  一个无参构造函数,创建一个坐标为(0,0,0)的点。

(3)  一个带参数的构造函数,按指定坐标创建一个点。

(4)  Z的获取器函数。

(5)  覆盖distance函数,返回三维空间中两点之间的距离。

(6)  一个名为getPerimeter()的函数,返回矩形的周长。

源代码

MyPoint.h

#ifndef MyPoint_H
#define MyPoint_H


class MyPoint
{
double  x,y;//表示坐标
public:
MyPoint();
MyPoint(double _x,double _y);
double getX();
double getY();
double distance(double _x,double _y);
};
#endif

3DPoint.h(更名为TDPonit.h)

#define TDPoint_H

#include"MyPoint.h"

class TDPoint:public MyPoint

{

       doublez;

public:

       TDPoint();

       TDPoint(double_x,double _y,double _z);

       doublegetZ();

       doubledistance(double _x,double _y,double _z);

};

MyPont.cpp

#include"math.h"

#include "MyPoint.h"

MyPoint::MyPoint()

{

       x=0;

       y=0;

}

MyPoint::MyPoint(double _x,double _y)

{

       x=_x;

       y=_y;

}

 

double MyPoint::getX()

{

       returnx;

}

 

 double MyPoint::getY()

{

       returny;

}

 

 double MyPoint::distance(double _x,double _y)

{

       doubledistance;

       distance=sqrt(pow((_y-y),2)+pow((_x-x),2));

       returndistance;

}

TDPont.cpp

#include"TDPoint.h"

#include"MyPoint.h"

#include"math.h"

 

TDPoint::TDPoint()

{

 

       z=0;

}

 

TDPoint::TDPoint(double _x,double _y,double_z):MyPoint(_x,_y)

{

       z=_z;

}

 

double TDPoint::getZ()

{

       returnz;

}

 

double TDPoint::distance(double _x,double_y,double _z)

{

       doubledistance;

       distance=sqrt(pow((getX()-_x),2)+pow((getY()-_y),2)+pow((z-_z),2));

       returndistance;

}

Main.cpp

#include<iostream>

#include"MyPoint.h"

#include"TDPoint.h"

#include"math.h"

using namespace std;

int main()

{

       doubledistance;

       TDPoint*a=new TDPoint();

       TDPoint*b=new TDPoint(10,30,25.5);

   distance=a->distance(10,30,25.5);

       cout<<"两点间的距离为:"<<distance<<endl;

       return0;

}

    从以上实验可以看出,新的类TDPoint继承自以前的类MyPoint,它在MyPoint类的基础上增加了一些数据成员和数据函数,同时又可以使用MyPonit类的成员函数,这给编码带来了方便。当然继承和派生需要注意的东西还有很多,例如继承的方式,不同的继承方式所带来的引用后果都有所不同,这将在以后的实验中继续体现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值