wordpress图片站,模板网站建设报价,网站优化步骤,国内最新消息文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么#xff1f;继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象#xff0c;但是父类对象不能直接赋值给… 文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象但是父类对象不能直接赋值给子类对象父类指针可以直接指向 子类 对象但是子类指针不能直接指向父类对象父类类型的引用可以直接引用 子类 对象但是子类引用不能直接引用父类对象 继承的定义 继承(inheritance)机制是面向对象程序设计使代码复用的最重要的手段 它允许程序员在保持原有类特性的基础上进行扩展增加功能这样产生新的类称派生类或者子类。 继承呈现了面向对象程序设计的层次结构体现了由简单到复杂的认知过程。 继承的目的是为了代码重用、扩展基类的行为并建立一个类型之间的层次结构。 继承的语法
C的继承分为单继承和多继承
单继承语法
class 子类名 继承权限 父类名
{子类类体
}多继承语法
class 子类名: 继承权限 父类名,继承权限 父类名,继承权限 父类名, ......
{子类类体
}多继承的语法其实就是在单继承后面加上逗号再进行添加继承的父类 继承权限和继承到子类后父类成员的访问限定符的变化
3个继承权限和类里面的3个访问限定符一样分为
公有继承权限关键字public保护继承权限关键字protected私有继承权限关键字private 继承到子类后父类成员的访问限定符的变化
继承到子类后父类成员的访问限定符的变化都是固定的语法规定好的所以记住就好 可以表现成如下的表格
类成员/继承方式public继承protected继承private继承父类中的 public成员变成子类中的public成员变成子类中的protected成员变成子类中的private成员父类中的 protected成员变成子类中的protected成员变成子类中的protected成员变成子类中的private成员父类中的 private成员子类不可访问子类不可访问子类不可访问
注意 父类中的private限定的成员不管以什么继承权限继承到子类子类都访问不了 因为这是private限定符的特点除了友元以外private限定的都只能在类域里面被访问类外的任何地方都不能访问 父类中被protected限定符限定的成员可以在继承该父类的子类以及父类自己的类域里面访问在其他地方不能访问 所以protected限定符是专门为继承而设置的 使用关键字class定义的子类默认的继承方式是private 使用struct定义的子类则默认的继承方式是public 不过为了可读性最好显示的写出继承方式 虽然继承权限有3个但是我们实际写代码用继承的时候基本上都会用public继承权限进行继承 子类继承到了父类的什么
子类会继承父类的所有成员【包括成员变量和成员函数】父类的private修饰的私有成员也会继承下来只不过就算继承下来了子类也访问不了
但是其中又有一些小细节 子类继承来的非静态成员变量子类实例化对象后会把它们存储在自己的对象中。 但是静态成员变量就不会而且子类继承到的静态成员变量和父类中的是同一个同一地址的变量 因为父类自己的静态成员变量都不存储在对象中而是存储在全局区让所有的父类对象访问到的是同一变量 所以其是子类继承静态成员变量就相当于是子类的所有对象和父类所有对象一样拥有了访问存储在全局区的父类的静态成员变量的权利 因为所有类的成员函数都不存储在对象中而是和普通函数一样存储在公共的代码段只不过有类域的限制 所以子类继承父类的成员函数当然不是拷贝一份下来而是和父类一样拥有了访问和使用这些函数的权利了。 继承中的作用域 子类和父类的作用域是不同的独立的是不同的两个类域 所以子类才不能在自己的类域中访问父类的private成员同样的父类也不能在自己的类域中访问子类定义的private成员 如果子类自己又定义了与父类同名的成员【包括成员变量和成员函数】那么子类自己定义的和从父类那里继承来的同名的成员就构成隐藏 隐藏构成隐藏的成员虽然同名并且在同一作用域【子类类域】下但是不会报错可以共存 但是子类对象指针引用直接使用这个构成隐藏的成员的时候只会使用到子类自己定义的那个成员。 此时如果要使用从父类那里继承来的就要加上父类的类域进行限制 例 此时要特别注意 因为子类的自己定义的成员函数与从父类那里继承来的成员函数同名也会构成隐藏。 也就意味着此时子类调用直接构成隐藏成员函数的时候只会找子类自己类域中的同名函数不会去父类里面找即使父类里面有合适的 因为有函数重载的存在此时使用不慎就会出错 例 因为子类直接调用构成隐藏的成员函数就只会在子类自己的类域中找同名就构成隐藏了 但是因为函数重载的存在编译器对函数调用的要求更高要同名同参数表才能调用 所以因为构成隐藏就只能在子类中找函数进行调用但是在子类里面又找不到调用的func的重载那就只能报错了
所以实际的代码编写的时候尽量不要定义同名的成员 子类和父类之间的赋值转换
子类对象可以直接赋值给父类对象但是父类对象不能直接赋值给子类对象
子类对象可以直接赋值给父类对象是因为 子类会继承父类的所有成员所以父类里面有的成员子类里面也一定有 即使子类自己又新增了成员变量子类对象赋值给父类对象的时候也只需要“切割”一下就好 此时子类B的对象要赋值给父类A的对象也只需要沿着上图中蓝色的线“切割”一下就好 而父类对象之所以不能直接赋值给子类对象 就是因为如果子类对象新增了成员那新增的成员父类一定是没有的
如果赋值过去的话子类自己新增的成员就接收不到赋值 父类指针可以直接指向 子类 对象但是子类指针不能直接指向父类对象
父类指针可以直接指向子类对象是因为
父类对象的大小一定是小于等于子类对象的大小的所以父类指针指向子类对象的时候解引用父类指针一定不会越界访问父类指针指向子类对象的时候父类指针只能操纵子类从父类那里继承来的成员 例
所以父类指针可以直接指向子类对象并且是安全的 子类指针不能直接指向父类对象就是因为
子类对象的大小一定大于等于父类对象那么当子类对象的大小大于父类对象时子类指针指向父类对象的话 解引用一下子类指针或者访问修改一下子类自己新增的成员都会越界 例 所以子类指针直接指父类对象是非常不安全的 父类类型的引用可以直接引用 子类 对象但是子类引用不能直接引用父类对象
原因和父类指针可以直接指向 子类 对象但是子类指针不能直接指向父类对象的原因一模一样
父类对象的大小一定是小于等于子类对象的大小的所以父类引用引用子类对象的时候直接使用父类引用一定不会越界访问父类引用引用子类对象的时候父类引用也只能操纵子类从父类那里继承来的成员子类对象的大小一定大于等于父类对象那么当子类对象的大小大于父类对象时子类引用引用父类对象的话 访问修改一下子类自己新增的成员就会越界 例