
点击蓝字 关注我们

第四节 继承

继承是面向对象编程中的一个重要概念,它允许一个类(子类/派生类)使用另一个类(父类/基类)的属性和行为。在继承中,子类可以继承父类的成员变量和成员函数,同时也可以添加自己的新成员变量和成员函数,或者覆盖(重写)父类的成员函数。
派生类是在面向对象编程中指的子类或衍生类,它是通过继承一个或多个基类(父类)而创建的。派生类可以访问基类中所有的非私有成员。
class Shape {public:void setwidth(int w) {width = w;}protected:int width;};//class 派生类名:继承类型 基类名class Circle:public Shape {public:double calculateArea() {return 3.14 * width * width;}};
Circle 是 Shape 的派生类,通过 public 关键字进行公有继承。Circle 类继承了 Shape 的 setWidth函数,并添加了一个新的成员函数 calculateArea 来计算圆的面积。派生类在使用基类的成员变量和成员函数时,可以直接使用它们,而无需重新声明。在这个例子中,Circle 类中的 calculateArea 函数可以直接访问 Shape 类的width成员。
派生类还可以覆盖(重写)基类的成员函数,为其提供新的实现。这样的覆盖在设计模式中通常称为多态性。
在C++中,继承有三种主要类型:
三种继承方法子类都继承了父类的公有成员和保护成员,但不能直接访问父类的私有成员。
有如下例子,父类为Shape:
class Shape {public:void setwidth(int w) {width = w;}void setheight(int h) {height = h;}protected:int width;int height;private:int privateVal;};
公有继承:
在公有继承中,父类的公有成员和保护成员在子类中仍然保持公有和保护属性。
class Shape1:public Shape {public:void derivedtest() {void setwidth();// 子类可以访问继承得到的公有或保护成员或调用函数privateVal = 20;//不正确,父类私有成员不可访问}};
保护继承:
在保护继承中,父类的公有成员和保护成员在子类中都为保护属性。
class Shape1:protected Shape {};
私有继承:
在私有继承中,父类的公有成员和保护成员在子类中变为私有属性。
class Shape1:private Shape {};
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。
多继承:
多继承是指一个派生类可以同时继承自多个基类。
#include <iostream>using namespace std;#include<string>class Shape {public:void setwidth(int w) {width = w;}void setheight(int h) {height = h;}int width;int height;};class Color {public:void setcolor(string c) {color = c;}string color;};//派生类,同时继承 Shape 和 Colorclass Rectangle :public Shape,public Color {public:double calculateArea() {return width * height;}};int main() {Rectangle r1;r1.setwidth(10);r1.setheight(20);r1.setcolor("red");cout << "有一个" << r1.color << "的长方形" <<"宽度和高度分别为:" << r1.width << "和" << r1.height <<",它的面积为:" << r1.calculateArea() << endl;system("pause");return 0;}
这里定义了一个长方形(Rectangle)类,Rectangle 类同时继承自 Shape 和 Color 两个基类。通过使用 public 关键字,Rectangle 类既能够访问 Shape 类的成员,也能够访问 Color 类的成员。这里将上述代码中保护权限的width和height改为了公有权限,以便可以不通过成员函数直接调用数据,具体事项看文末。
有一个red的长方形宽度和高度分别为:10和20,它的面积为:200
注意事项:
子类可以直接访问继承自父类的公有(public)数据,而不必通过成员函数。对于受保护数据来说,子类可以直接访问继承自父类的受保护(protected)数据,但通常要在成员函数内进行。直接在子类的成员函数内访问父类的受保护数据是允许的,而不必通过成员函数调用的方式。虽然在成员函数内可以直接访问受保护的数据,但通常在实际过程中,还是建议通过成员函数来访问数据,以提高代码的封装性和可维护性。
END
往期推荐




