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、派生类对象可以向基类对象赋值

class A {  
    public:  
        int x;  
        int y;  
        void show();  
};  
class B :public A {  
    public:  
        int z;  
};  
int main() {  
    A a;  //x, y  
    a.x = 1;  
    a.y = 2;  
      
    B b; //x, y, z  
    b.x = 10;  
    b.y = 20;  
    b.z = 30;  
    //派生类对象向基类对象赋值  
    a = b; //a.x = b.x;  a.y = b.y;  
}    
//派生类对象为基类对象赋值,则b对象中的x,y的值会赋值给a对象的x和y, 因为z在a对象中不存在,所以不会有z的赋值。  
a = b;  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clown_30

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值