C++继承总结

C++中的继承的定义是 面向对象的程序设计是代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。那么这定义具体是什么意思呢,通俗点讲,就是有一个类对所继承的类的拓展,继承原类所有属性并添加自己所独有的方法和属性。例如功能手机和智能手机智能手机继承了功能手机的打电话发短信等所有功能但是智能机明显比功能手机的功能更多,所以他就有创造出自己所特有的功能,继承体现了面向对象程序设计的层次结构,体现了有简单到复杂的认知过程。
那么继承在代码中应该怎么写,首先你得有个被继承的类和一个继承的类,被继承的类我们称之为基类也叫父类,继承的类我们称之为派生类继承方式是 class 派生类名: 继承类型 基类名。例如下面的例子中Base为基类,而Derive为派生类

了解完继承的书写方式我们下面就来了解一下继承类型,但是我们有必要了解一下什么是继承类型 ,其实基类通过不同的继承类型来控制派生类所继承的基类成员的可见性,下面我们会具体的讲到。
继承类型共分为三种:public、protected、private和类成员的访问限定符一样,但是功能有一定的差别。在继承中一般用的是public,在极少情况下才采用其他的两种方式。
先从public 开始public其实就是原样继承,基类中基类成员范文限定符是什么派生类中继承的基类成员的访问限定符就是什么,不发生一点变化。所以在派生类中可以访问基类中的共有和保护成员但不可访问基类的私有成员 。例如:

在派生类中访问了基类的私有成员编译就会出错。


同时建立当建立一个派生类的对象时只可以对继承的派生类中的基类的公有成员进行赋值和访问,保护成员不管是派生类的还是继承的都不能进行赋值和访问的,必须在派生类中访问和赋值。当你创建一个基类的对象时,同样也不能访问保护成员和私有成员。
protected继承,就是继承的时候把继承限定符为public的成员变为protected例如原来Base类中的data1访问限定符为public,若Deriver类保护继承以后在Derive中data1的访问限定符就变成了protected,保护和私有的成员访问限定符不变。在派生类中仍然可以访问访问限定符为protected的成员。
private继承时,继承后派生类中把基类的限定符为public和protected的成员都变成了private类,但改变后在派生类中仍然可以访问,但是基类中就是private修饰的成员,继承以后在派生类中仍然不可访问。
不管是哪种继承方式,在派生类内部可以访问基类的公有和保护类成员,私有成员存在但是不能被访问。
上面就算把继承类型总结完了。下面我们总结一下默认函数。在派生类中如果没有显式的定义,那么,他会默认合成包括构造函数,拷贝构造函数,析构函数,赋值运算符重载,取地址符重载,const修饰的取地址符重载六个默认的成员函数

那么创建派生类对象时是怎么调用构造函数的呢?怎么调用析构函数呢?要解决这个问题,我们必须把构造函数和析构函数显式定义出来

  根据运行结果可以看出来构建一个派生类对象时,先调用的是基类的构造函数然后再调用派生类的构造函数,但是如果按步骤执行时,你会发现,其实是先调派生类的构造函数但是再调用过程中并没有进入到派生类的构造函数内部就去调用基类的构造函数,等到基类构造函数结束以后,再进入派生类构造函数内部。
  但是要注意的是,如果基类中没有定义构造函数,则派生类也可以不用定义,但是如果基类定义了带有形参的构造函数派生类就一定要定义构造函数。
  析构函数就没有那么复杂,先调用派生类的析构函数后调用基类的析构函数。
继承体系中的作用域:
  在继承体系中基类和派生类是两个不同的作用域,就是说派生类继承基类继承的不是基类的空间而是继承的基类的方法和成员,在创建派生类对象时,要给继承自基类的成员在栈中开辟空间。
  如果派生类中有和基类同名的成员,派生类成员将会屏蔽基类重名成员,如果要访问基类同名成员要用 基类::基类成员 访问(如图所示)。但是最好不要定义重名的成员。

友元函数与继承:
友元福安息不能被继承,积累的友元函数不能访问子类的私有成员
继承与静态成员:
基类中定义了静态成员,那么这个继承体系中只有一个这样的成员。无论这个基类派生出多少派生类。
多重继承:
     一个派生类可以继承多个基类,同时一个基类可以被多个子类继承,一个派生类继承多个基类的方式为 class 派生类名:继承类型 基类名,继承类型 基类名 如图所示:

继承内容和权限和单继承差不多,只不过多了个基类。
菱形继承:
类似于:

代码为:

如上图代码Deriver类对象中有两份Base成员,所以说菱形继承存在二义性和数据冗余问题。而虚继承则解决了菱形继承的这两个问题
虚继承代码和菱形继承差不多,唯一的区别就是在Text基类时 在继承类型上是virtual public 数据类型是前四个字节存的是一个地址,然后是存Text的成员变量,然后Text1的成员变量,最后是派生类Deriver的成员变量,第一个地址中存的是这个内存空间的首地址和偏移量。
这就是我的一点看法,可能不太全面,欢迎各位大神指点。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值