cpp中的继承

       也是很久没有更新了,最近都比较忙碌。好了,今天我们来看一看在c++面向对象里面的继承。

        继承是面向对象三大语法之一,继承的出现主要是可以收集不同类当中相同的部分,可以避免重复一样的代码,将重复代码打包到父类中,要用的时候用继承调用,从而达到简化编程的目的。

一、语法

被继承着称为“父类”,继承者称为“子类”
                       Base                        Son
语法:   class 类名:继承方式 父类名

        我们不难看出,在使用时我们需要创建两个类:父类、子类。子类可以继承父类的部分成员,并且一个父类可以被多个子类继承。写成代码的形式就是:

//父类
class Base {
public:
	int B_A;
protected:
    int B_B;
private:
	int B_C;

};
//子类1
class Son1 :public Base {
public:
	int S_A;
    int S_B;
};
  二、继承方式

        继承方式(三个):公共继承(public),保护继承(protected),私有继承(private)

        继承方式              子类访问
*      public---------------父类属性是怎样就怎样
*      protected------------public(父)-->protected(子)
*      private--------------父中所有---->不可访问(但可以继承)

       在这个例子当中,我们的类Son1是通过public的方式访问类Base中的成员B_A,所以我们可以访问Base里的public和protected里面的B_A和B_B,而private权限里的B_C,是访问不到的。

      子类的访问方式对调用父类的成员是有很大限制的,这里我就贴一下

 

     这里子类通过继承方式也改变了父类成员的访问权限,如果是public,该怎样就怎样,如果是protected,父类中除private的成员其他都被修改为protected权限,而同理private也是一样的

三、对像模型

       我们创建了一个含有继承的类

//父类
class Base {
public:
	int B_A;
protected:
    int B_B;
private:
	int B_C;

};
//子类1
class Son1 :public Base {
public:
	int S_A;
    int S_B;
};

接下来我们再计算一下有类Son1创建对象的大小

Son1 s;
cout<<"Son1类的大小是= "<<sizeof(s)<<endl;

其打印出来的结果是

       我们大致可以推断出来,这里的20来自子类和父类所有元素大小的总和,无论我们子类对父类的继承方式怎么样,或者父类成员的访问权限怎么样,我们子类都可以将父类的所有成员全部都继承过来 ,访问就是另一回事。

四、访问顺序

       如果我们创建了一个Son1类型的对象s1,在程序运行的时候,究竟是先走父级还是先走子级呢?我们可以写一个函数来验证一下

//父类
class Base {
public:
	Base(){
      cout<<"父级Base构造函数的调用"<<endl;
    }
    ~Base(){
      cout<<"父级Base析构函数的调用"<<endl;
    }

};
//子类1
class Son1 :public Base {
public:
    Son1(){
       cout<<"子级Son1构造函数的调用"<<endl;
   }
    ~Son1(){
       cout<<"子级Son1析构函数的调用"<<endl;
   }
	
};

      当我们将其运行起来的时候结果是这样的

       仔细看看,这不就和的运行顺序(先入的后出)一样吗,首先是父级先被调用,然后是子级被调用,销毁,最后是父级被销毁。 

五、同名成员的处理

      对于父级和子级中相同名称的变量,如果我们单独调用的话,默认是优先子级的,如果我们想要在类外修改父级的同名变量,我们则需要在语句上加一些前缀:

      这是默认访问子级的同名成员(假设同S_A):

s.S_A=100;

     这是访问父级成员的方式:

s.Base::S_A =100;

    多了两个冒号,这个意思是表示作用域是父级

函数同理,但有一点不同:
    重载只能发生在一个类当中,父级的重载不能直接区分同名函数,如果没有加作用域,那么都是用子级的函数
    也就是说,在加作用域之前,父级的函数是被子级直接覆盖住了

 好了,以上就是本篇文章的全部内容了,如果出现什么问题的话,欢迎各位大佬在评论区指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值