继承与派生的概念
- 继承所表达的是对象类之间的一种关系。它使得某类对象可以继承另外一类对象的特征和能力。
- 继承使得程序员对共同的属性及操作只需说明一次,减少了相似类的重复说明,并且在具体情况下可以扩展和细化 这些属性及操作。
保持已有类的特性而构造新类的过程称为继承。 - 在已有类的基础上新增自己的特性而产生新类的过程称为派生。
- 被继承的已有类称为基类(或父类)。
- 派生出的新类称为派生类 (或子类)。
继承的作用
在面向对象系统中,引入继承机制后具有的作用:
能减少代码和数据的重复冗余度,大大增加程序代码的复用性;
能清晰体现相关类间的层次结构关系;
对多个概念进行组合。
声明派生类
声明派生类的一般格式为:
class 派生类名: 继承方式 基类名
{
// 派生类新增的数据成员和成员函数
……
};
其中“基类名”是一个已经定义的类的名称,“派生类名”是继承原有类的特性而生成的新类的名称。
“继承方式”表示如何访问从基类继承的成员,它可以是关键字private、protected和public,分别表示私有继承、保护继承和公有继承。由类Person派生出类Student可以采用后面三种格式
具体的对于继承其他知识:
函数重写,虚函数,抽象对象,动态绑定与静态绑定的知识就不写在这里了。
接下来直接贴题目和代码:
题目一
//
// main.cpp
// CppCP7_1
//
// Created by Chenjun Xiong on 27/04/2017.
// Copyright © 2017 Chenjun Xiong. All rights reserved.
//
//利用虚函数求面积
//
//题目描述
//定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle( 长方形)、和Triangle (三角形),用虚函数分别计算面积。
//编写求面积和函数TotalArea (vector <Shape * >),该函数利用基类指针向量,它的每一个元素指向一个派生类的图形对象。
//编写测试解释器,读入各种图形信息,生成各种图形对象,由vector<Shape * > 管理。
//利用求面积虚函数,输出面积总和,要求正确释放空间。PI取3.1416
//
//输入描述
//circle 后跟半径
//rectangle后跟长和宽
//triangle后跟三条边
//
//输出描述
//结果保留小数点后4位
//
//输入样例
//circle 5.2 circle 6.0
//rectangle 3.4 2
//triangle 3 4 5
//rectangle 4.4 10
//
//输出样例
//254.8465
#include <iostream>
#include <math.h>
#include <vector>
#include <string.h>
#include <iomanip>
#define PI 3.1416;
using namespace std;
//below is shape class
class Shape{
protected:
double area;
public:
Shape(){area=-1;};
virtual double CalArea(){
return area;};
double static TotalArea(vector <Shape*> &vecShapes);
void static DeleteAllShapes(vector <Shape*> &vecShapes);
virtual ~Shape(){};
};
double Shape::TotalArea(vector <Shape*> &vecShapes){
double TotalArea=0;
for(int index=0;index<vecShapes.size();index++){
TotalArea+=vecShapes[index]->CalArea();
}
return TotalArea;
}
void Shape::DeleteAllShapes(vector <Shape*> &vecShapes){
for(int index=0;index<vecShapes.size();index++){
if(vecShapes[index])
delete vecShapes[index];
}
while(vecShapes.size()>0){
v