暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++进阶学习:第四节-继承

Cpp入门到精通 2024-01-30
70

点击蓝字 关注我们


c++进阶学习

第四节 继承


      继承是面向对象编程中的一个重要概念,它允许一个类(子类/派生类)使用另一个类(父类/基类)的属性和行为在继承中,子类可以继承父类的成员变量和成员函数,同时也可以添加自己的新成员变量和成员函数,或者覆盖(重写)父类的成员函数。

派生类是在面向对象编程中指的子类或衍生类,它是通过继承一个或多个基类(父类)而创建的。派生类可以访问基类中所有的非私有成员

    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 和 Color
              class 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 类同时继承自 ShapeColor 两个基类。通过使用 public 关键字,Rectangle 类既能够访问 Shape 类的成员,也能够访问 Color 类的成员。这里将上述代码中保护权限的width和height改为了公有权限,以便可以不通过成员函数直接调用数据,具体事项看文末。

                有一个red的长方形宽度和高度分别为:10和20,它的面积为:200

                注意事项:

                子类可以直接访问继承自父类的公有(public)数据,而不必通过成员函数。对于受保护数据来说,子类可以直接访问继承自父类的受保护(protected)数据,但通常要在成员函数内进行。直接在子类的成员函数内访问父类的受保护数据是允许的,而不必通过成员函数调用的方式。虽然在成员函数内可以直接访问受保护的数据,但通常在实际过程中,还是建议通过成员函数来访问数据,以提高代码的封装性和可维护性。




                END

                往期推荐

                C++进阶学习:第三节-构造函数&析构函数

                C++进阶学习:第二节-访问修饰符

                C++进阶学习:第一节-面向对象编程

                c++基础学习-目录

                文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论