1、继承
1.1、认识继承
继承一般发生在家族图谱、动植物分类等,注意关系要合理
比如:
学生:姓名 年龄 身高 学生编号
吃饭 睡觉 学习
老师:姓名 年龄 身高 教师编号
吃饭 睡觉 备课
职工:姓名 年龄 身高 职工编号
吃饭 睡觉 工作
抽离出类中共同的部分组成人类。
人类:
属性:姓名,年龄,身高
方法:吃饭,睡觉
在设计程序时可以让学生类/教师类/员工类 继承 自 人类。
1.2、继承概念
继承发生在类与类之间,通过继承机制,可以利用已有的数据类型来定义新的数据类型,
所定义的新的类不仅拥有新定义的成员,还有继承来的成员。
已存在用来派生其他类的类叫基类或父类,由已存在的类派生出来的类叫派生类或者子类。
目的:类复用,提高效率,缩短开发周期。
继承的分类:单继承 、 多继承
继承过程:
1、吸收父类成员 --- protected public
2、覆盖基类同名成员
3、添加新成员
2、继承使用
继承分为单继承和多继承。
2.1、单继承
单继承:只有一个父类
单继承定义格式:
class 派生类名:继承方式 基类名
{
// 新成员
};
继承方式说明:将基类看做子类的成员,当子类创建对象时,以何种权限实现对其成员的访问。
public:基类公有成员和保护成员保持原有的状态,父类私有成员不能在派生类中访问
-- 一般设计成public
private:基类公有成员和保护成员都作为派生类的私有成员
protected:基类公有成员和保护成员都作为派生类的保护成员
继承方式通常为public。
举例:
设计3维坐标类,让它继承2维坐标Point类
#include<iostream>
using namespace std;
// Point -- 基类
class Point
{
private:
int xp;
int yp;
public:
Point(int x=0,int y=0)
{
xp = x;
yp = y;
}
void show()
{
cout << "父类:xp" << xp << ",yp" << yp << endl;
}
protected:
void setXP(int x)
{
xp = x;
}
int getXP(void)
{
return xp;
}
void setYP(int y)
{
yp = y;
}
int getYP(void)
{
return yp;
}
};
// Point3D -- 子类
class Point3D:public Point
{
private:
int zp;
public:
Point3D(int x=0,int y=0,int z=0):Point(x,y),zp(z)
{
}
void show()
{
cout << "xp" << getXP() << ",yp" << getYP() << ",zp" << zp << endl;
}
};
int main()
{
Point3D a(1,2,3);
a.show();
return 0;
}
注意:
如果在子类初始化的时候想自动调用父类的构造函数只能用初始化表达式的形式
设计类的时候一般属性设置为private protected public,但是成员函数一般设置成public.
2.2、多继承
多继承:有多个父类,比如圆角矩形即会继承矩形的特点也会继承圆的特点。
多继承定义格式:
class 派生类名:继承方式 基类名,继承方式 基类名.......
{
};
例子:
设计圆角矩形类让其继承矩形类和圆类
#include<iostream>
#define PI 3.14
using namespace std;
class Rect
{
private:
float width;
float height;
public:
Rect(float w=0,float h=0)
{
width = w;
height = h;
}
float getArea(void)
{
return width * height;
}
protected:
void setWidth(float w)
{
width = w;
}
float getWidth(void)
{
return width;
}
void setHeight(float h)
{
height = h;
}
float getHeight(void)
{
return height;
}
};
class Circle
{
private:
float radius;
public:
Circle(float r=0)
{
radius = r;
}
float getArea(void)
{
return PI * radius * radius;
}
protected:
void setRadius(float r)
{
radius = r;
}
float getRadius(void)
{
return radius;
}
};
class RoundRect:public Rect,public Circle
{
public:
RoundRect(float w=0,float h=0,float r=0):Rect(w,h),Circle(r)
{
}
float getArea(void)
{
// 圆角矩形的面积 = 矩形面积 - 4 * (2r*2r-PI*r*r)
return Rect::getArea() - 4 * (2*getRadius()*2*getRadius()-Circle::getArea());
}
};
int main()
{
RoundRect r1(2,4,1);
float res = r1.getArea();
cout << res << endl;
return 0;
}
注意:
多继承可能会遇到多个父类重定义了同名的属性或者成员函数造成二义性问题; ambiguous
解决方案:在属性或者成员函数前加 类名::
标签:继承,成员,float,C++,void,基类,public From: https://blog.csdn.net/amyliyanice/article/details/144409495