C++ 继承
继承允许我们依据另一个类来定义一个类,达到了重用代码功能和提高执行时间的效果
继承 是面向对象的三大特征之一
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可
这个已有的类称为 基类
新建的类称为 派生类
基类 & 派生类
一个类可以派生自多个类,也就是说它可以从多个基类继承数据和函数
定义一个派生类时,可以使用一个类派生列表来指定基类
类派生列表以一个或多个基类命名,形式如下
class derived-class: access-specifier base-class
访问修饰符 access-specifie
是 public
、protected
或 private
三者之一
base-class
是之前定义过的某个类的名称
如果未使用访问修饰符 access-specifier
,则默认为 private
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> // 基类 class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 派生类 class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle r; r.setWidth(5); r.setHeight(7); // 输出对象的面积 std::cout << "Total area: " << r.getArea() << std::endl; return 0; }
编译和运行以上范例,输出结果如下
Total area: 35
访问控制和继承
派生类可以访问基类中所有的非私有成员
基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private
下表列出了根据访问权限总结出不同的访问类型
访问 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类 | yes | yes | no |
外部的类 | yes | no | no |
一个派生类继承了所有的基类方法,但下列情况除外
- 基类的构造函数、析构函数和拷贝构造函数
- 基类的重载运算符
- 基类的友元函数
继承类型
当一个类派生自基类,该基类可以被继承为 public
、 protected
或 private
几种类型
继承类型是通过访问修饰符 access-specifier
来指定的
我们几乎不使用 protected
或 private
继承,通常使用 public
继承
当使用不同类型的继承时,遵循以下几个规则
-
公有继承 ( public )
当一个类派生自 公有 基类时
- 基类的 公有 成员也是派生类的 公有 成员
- 基类的 保护 成员也是派生类的 保护 成员
- 基类的 私有 成员不能直接被派生类访问,但是可以通过调用基类的 公有 和 保护 成员来访问
-
保护继承 ( protected)
当一个类派生自 保护 基类时,基类的 公有 和 保护 成员将成为派生类的 保护 成员
-
私有继承 ( private )
当一个类派生自 私有 基类时,基类的 公有 和 保护 成员将成为派生类的 私有 成员
多继承
多继承即一个子类可以有多个父类
C++ 类可以从多个类继承成员,语法如下
class <派生类名>:<访问修饰符> <基类名1>,<访问修饰符> <基类名2>,… { <派生类类体> };
访问修饰符可以是 public
、protected
或 private
三者之一
各个基类之间用逗号分隔
/** * file: main.cpp * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <iostream> // 基类 Shape class Shape { public: Shape(){ width = 0; height = 0; } Shape( int a, int b ){ width = a; height = b; } protected: int width; int height; }; // 基类 PaintCost class PaintCost { public: int cost(int area) { return area * 70; } }; // 派生类 class Rectangle: public Shape, public PaintCost { public: Rectangle(int a,int b):Shape(a,b){} int area() { return width * height; } }; int main(void) { Rectangle rect(5,7); int area = rect.area(); // 输出对象的面积 std::cout << "Total area: " << area << "\n"; // 输出总花费 std::cout << "Total paint cost: $" << rect.cost(area) << "\n"; return 0; }
编译和运行以上范例,输出结果如下:
Total area: 35 Total paint cost: $2450