• C++,权限修饰符、继承与派生、派生类的构造函数、继承的二义性、基类与派生类的转换


     

    目录

    一、权限修饰符

    二、友元

    三、继承与派生

    四、派生类的构造函数和析构函数

    五、继承的二义性(三角形)

    六、基类与派生类的转换


    一、权限修饰符

           public:共有

           protected:受保护

           private:私有

    使用

           修饰成员(成员变量、成员方法)

    注意 

           只改变作用域,不改变内存分配

     修饰成员(成员变量、成员方法)和

      public:     成员在任何位置可被访问

      protected:     成员在当前类与派生类中可被访问

      private:         成员在当前类中可被访问

          

    二、友元

    1、友元打破访问权限的限制,即让访问权限不生效

    2、友元包括

           类的友元C函数;

           类的友元成员函数;

           类的友元类,类的友元可以访问类中所有的成员(包括public、protedcted和private成员)

    3、类的友元C函数就是在类中把普通的C函数用friend进行声明

    4、类的友元成员函数就是在类中把另一个类的成员函数用friend进行声明

    5、类的友元类就是在类中把另一个类用friend进行声明

    三、继承与派生

    1、继承与派生的概念

           a、继承封装与多态是面向对象语言的核心思想

           b、继承可以使面向对象语言代码重用

           c、一个派生类只从一个基类派生,这称为单继承(single inheritance),这种继承关系所形成的层次是一个树形结构.

           d、从多个基类派生。一个派生类有两个或多个基类的称为多重继承

    2、派生类的声明

           a、声明派生类的一般形式为

                  class 派生类名: [继承方式] 基类名1,....,[继承方式]基类名n { 派生类新增加的成员 } ;

           b、继承方式包括: public、 privat、protected如果不写此项,则默认为private(私有的)。

           c、单基继承

                假设有A类, 然后让B类公有继承 A类

                class B :public A { ...... };

           d、多基继承

                设置有A类、B类和C, D类公有继承A,私有继承B类,私有继承C

        class D :public A, protected B, private C { ...... } class D :public A, private B,private C { ...... }

    3、派生类的构成

    派生类中的成员包括从基类继承过来的成员和自已新增加的成员。 (成员指成员变量和成员函数)。

    4、继承与权限修饰

    • 派生类中的成员包括从基类继承过来的成员和自已新增加的成员。(成员指成员变量和成员函数)
    • 基类中private修饰的成员始终不能被派生类继承
    • 基类中public修饰的成员与受保护成员始终可以被派生类继承

    public继承

    protected继承

    private继承

    基类

    private

    protected

    public

    private

    protected

    public

    private

    protected

    public

    派生类

    protected

    public

    protected

    protected

    private

    private

    private 修饰的成员,任何情况下都无法被派生类继承。

    四、派生类的构造函数和析构函数

    • 构造函数和析构函数都不能被继承
    • 派生类对象被创建时,基类对象会被先创建
    • 派生类的构造函数被调用时,会先调用基类的其中一个构造函数
    • 派生类的构造函数中用了初始化表的方式调用了基类构造函数,默认不写时是调用了基类中可以不传参数的构造函数
    • 在派生类对象释放时,先执行派生类析构函数,再执行基类析构函数

    五、继承的二义性(三角形)

           1、多基继承的二义性

                  如果已声明了类A1、类A2,再让B继承A1A2

                  如果A1A2中同名字的成员,并且都被B继承下去了,些时使用B的对象访       问同名字的成员会产生二义性。

    2、共同基类产生的二义性(菱形)

           class B1: public A{......};

           class B2: public A{......};

           class C: public B1,public B2 {......};

          

           3、共同基类产生的二义性的解决办法——虚基派生

    相同的属性被合并。

    六、基类与派生类的转换

           1、基类与派生类的转换

                  a、基类声明的指针变量和引用类型变量可以指向派生类的对象。

          

        class B:public A {.........};

          B b;

          A *pa = &b;

          A &ra = b;

                  b、当使用对象的指针变量去访问对象的成员时,能访问到的成员只有从指针所属类中的继       承下来的成员

                  c、当使用对象的引用类型变量去访问对象的成员时,能访问到的成员只有从引用类型变量       所属类中继承下来的成员

    (只看类型,不看对象)

            d、派生类对象可以向基类对象赋值

    1. class A {  
    2.     public:  
    3.         int x;  
    4.         int y;  
    5.         void show();  
    6. };  
    7. class B :public A {  
    8.     public:  
    9.         int z;  
    10. };  
    11. int main() {  
    12.     A a;  //x, y  
    13.     a.x = 1;  
    14.     a.y = 2;  
    15.       
    16.     B b; //x, y, z  
    17.     b.x = 10;  
    18.     b.y = 20;  
    19.     b.z = 30;  
    20.     //派生类对象向基类对象赋值  
    21.     a = b; //a.x = b.x;  a.y = b.y;  
    22. }    
    23. //派生类对象为基类对象赋值,则b对象中的x,y的值会赋值给a对象的x和y, 因为z在a对象中不存在,所以不会有z的赋值。  
    24. a = b;  

  • 相关阅读:
    【LeetCode热题100】--2.两数相加
    Go语言开发实战课后编程题
    销售人员打开Dynamics 365 CRM点击模块弹出Insufficient Permissions提示
    GaussDB数据库SQL系列-动态语句
    ctf之:《kali-linux-2022-W48-virtualbox-amd64》工具测试netdiscover
    C# 显示OpenCV的mat对象图像
    Android平台GB28181设备接入模块相关博客概览
    buu web部分wp
    go语言文件操作
    基于随机无迹σ变异的改进HHO算法
  • 原文地址:https://blog.csdn.net/qq_52119661/article/details/133142962