c++(14)-继承
2020-02-16 17:57
232 查看
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承代表了 is a 关系,和has a有区别。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。但是电脑由主板,显示器、硬盘、内存、键盘等组成这是has a关系,不是继承。
访问控制和继承
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。
根据访问权限总结出不同的访问类型,如下所示:
访问 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类 | yes | yes | no |
外部的类 | yes | no | no |
*从public->protected->private访问权限被进一步收缩。
class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; };
- 一个派生类继承了所有的基类方法,但下列情况除外: 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。
继承类型
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:
- 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
- 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
- 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
// 派生类 class Rectangle: public Shape { public: int getArea() { return (width * height); } };
多继承
多继承即一个子类可以有多个父类,它继承了多个父类的特性。
C++ 类可以从多个类继承成员,语法如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类类体> };
#include <iostream> using namespace std; // 基类 Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 基类 PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // 派生类 class Rectangle: public Shape, public PaintCost { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // 输出对象的面积 cout << "Total area: " << Rect.getArea() << endl; // 输出总花费 cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; }
转载于:https://my.oschina.net/u/3472252/blog/919272
- 点赞
- 收藏
- 分享
- 文章举报
![](https://g.csdnimg.cn/static/user-reg-year/1x/3.png)
相关文章推荐
- C++顺序存储的线性表的代码
- C语言解决关于兔子的古典问题的代码
- C++ 学习笔记(一) cout 与printf 的不同之处
- C++ 学习笔记(二) const的加强
- C语言值传递与址传递
- C++课程笔记 Lesson 01
- 五道金融计算题在C语言上的实现
- iOS导入c++语言的静态库之后编译不过,先要检查是否导入了libstdc++
- c++ 编译出现error : identifier '_DebugHeapTag'
- C/C++内存四区
- c语言数字图像处理(二):图片放大与缩小-双线性内插法
- c语言数字图像处理(三):仿射变换
- c语言数字图像处理(五):空间滤波
- c语言数字图像处理(六):二维离散傅里叶变换
- c语言数字图像处理 4000 (七):频率域滤波
- c语言数字图像处理(八):噪声模型及均值滤波器
- c语言数字图像处理(九):边缘检测
- c语言数字图像处理(十):阈值处理
- MFC C++视频播放和视频的浓缩播放和检测目标接口
- MFC C++ 视频浓缩借口实现