Hello,C++(4)继承

Hello,C++(4)继承

继承

类之间的关系:包含、使用、继承

 继承重要说明

1)子类继承了父类的全部成员变量和成员方法(除了构造和析构之外的成员方法)

2)子类可以拥有父类没有的方法和属性

3)父类若有带参数的函数,可以将子类作为参数传递进去)

4)子类就是一种特殊的父类,子类对象可以当作父类对象使用

(儿子至少比父亲强:成员变量和方法至少比父亲多;儿子可以调用父亲的带参数函数;儿子也可以成为父亲)

子类对外访问属性表

Hello,C++(4)继承

“三看”原则判断能否访问(从外到内)

C++中的继承方式(public、private、protected)会影响子类的对外访问属性

判断某一句话,能否被访问

         1)看调用语句,这句话写在子类的内部、外部

         2)看子类如何从父类继承(public、private、protected)  

         3)看父类中的访问级别(public、private、protected)

(protect是为家族使用)

(在项目开发中,一般用public)

继承中的构造和析构

  • 类型兼容性原则

类型兼容规则是指在需要基类对象的任何地方,都可以使用公有子类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:

子类对象可以当作父类对象使用

子类对象可以直接赋值给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接引用子类对象

在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。

类型兼容规则是多态性的重要基础之一。

总结:子类就是特殊的父类 (base *p = &child;)

 

#include <cstdlib> #include <iostream>
using namespace std; /* 子类对象可以当作父类对象使用 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对象 父类引用可以直接引用子类对象 */

//子类就是特殊的父类

class Parent03 { protected: const char* name; public: Parent03() { name = "Parent03"; } void print() { cout<<"Name: "<<name<<endl; } }; class Child03 : public Parent03 { protected: int i; public: Child03(int i) { this->name = "Child2"; this->i = i; } }; int main() { Child03 child03(1000); //分别定义父类对象 父类指针 父类引用 child Parent03 parent = child03; Parent03* pp = &child03; Parent03& rp = child03; parent.print(); pp->print(); rp.print(); system("pause"); return 0; }

 

问题:如何初始化父类成员?父类与子类的构造函数有什么关系

         在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化

         在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理

 

 
  • 继承中的构造析构调用原则

1、子类对象在创建时会首先调用父类的构造函数

2、父类构造函数执行结束后,执行子类的构造函数

3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用

4、析构函数调用的先后顺序与构造函数相反

  • 继承与组合混搭情况下,构造和析构调用原则

         原则:    先构造父类,再构造成员变量、最后构造自己

                          先析构自己,在析构成员变量、最后析构父类

继承中的重名成员变量处理方法

1、当子类成员变量与父类成员变量同名时

2、子类依然从父类继承同名成员

3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符

4、同名成员存储在内存中的不同位置

 

总结:同名成员变量和成员函数通过作用域分辨符进行区分

派生类中的static关键字

继承和static关键字在一起会产生什么现象哪?

理论知识

  • 基类定义的静态成员,将被所有派生类共享
  • 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 (遵守派生类的访问控制)
  •  派生类中访问静态成员,用以下形式显式说明:

                          类名 :: 成员

或通过对象访问    对象名 . 成员

静态数据成员的初始化必须显式地初始化在外面。这句话告诉编译器分配内存,否则无法继承。

总结:

1> static函数也遵守3个访问原则

2> static易犯错误(不但要初始化,更重要的显示的告诉编译器分配内存)

3> 构造函数默认为private

多继承的应用

多继承概念

  •   一个类有多个直接基类的继承关系称为多继承
  •   多继承声明语法

class  派生类名 : 访问控制  基类名1访问控制  基类名2 ,  … , 访问控制  基类名n

    {

         数据成员和成员函数声明

    };

  •   类 C 可以根据访问控制同时继承类 A 和类 B 的成员,并添加

     自己的成员

虚继承

  如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性(用虚继承来解决)

总结:

  •   如果一个派生类从多个基类派生,而这些基类又有一个共同

     的基类,则在对该基类中声明的名字进行访问时,可能产生

     二义性

  •   如果在多条继承路径上有一个公共的基类,那么在继承路径的某处

     汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象

  •   要使这个公共基类在派生类中只产生一个子对象,必须对这个基类

     声明为虚继承,使这个基类成为虚基类。

  •   虚继承声明使用关键字          virtual

 

继承总结

  • 继承是面向对象程序设计实现软件重用的重要方法。程序员可以在已有基类的基础上定义新的派生类。
  •  单继承的派生类只有一个基类。多继承的派生类有多个基类。
  •  派生类对基类成员的访问由继承方式和成员性质决定。
  •  创建派生类对象时,先调用基类构造函数初始化派生类中的基类成员。调用析构函数的次序和调用构造函数的次序相反。
  •  C++提供虚继承机制,防止类继承关系中成员访问的二义性。
  •  多继承提供了软件重用的强大功能,也增加了程序的复杂性。

 

转载于:https://www.cnblogs.com/juanjuanduang/p/10847014.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100933.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月6日 下午4:00
下一篇 2021年7月6日 下午5:00


相关推荐

  • ioctl() FIONREAD 检测socket是否有数据可读

    ioctl() FIONREAD 检测socket是否有数据可读先看看FIONREAD的作用FIONREAD:Getthenumberofbytesintheinputbuffer获取接收缓存中数据的字节数项目中用来判断tcpsocket是否有数据接收到,但是出现了一个问题,对于用于accept的socket即调用listen()之后的socket,用FIONREAD,判断的时候报错,ioctl()返回-1,错误码是2…

    2022年7月23日
    8
  • JavaScript 字符串截取方法汇总

    JavaScript 字符串截取方法汇总可以使用的方法及选择substring:最常见substr:不建议使用slice:最灵活JS新标准ECMAscript没有对substr进行标准化,因此不建议使用。slice比substring更灵活,允许使用负数做参数slice除了截取字符串,还可以截取数组参数和用法substring语法:stringObject.substring(start,stop)start,必需,非负整数,截取的开始位置stop,可选,非负整数,截取的字符串不包含该位置

    2022年6月13日
    38
  • 闪讯pppoe拨号模块损坏118_创翼pppoe拨号模块损坏

    闪讯pppoe拨号模块损坏118_创翼pppoe拨号模块损坏创翼错误118pppope拨号模块损坏.1809版本、创翼的bug一、新建一个.txt文件二、复制下面代码到.txt文件里并保存WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog]”ServiceDll”=hex(2):25,00,…

    2025年12月11日
    5
  • kong 网关日志格式修改

    kong 网关日志格式修改kong网关日志格式修改kong网关默认日志在/usr/local/kong/logs,主要有access.log,admin_access.log,error.log,access.log和nginx的access日志类似,这里会记录所所有通过kong网关的日志。有些时候这些日志并不能满足我们的需要,因此需要修改日志格式。当发现/usr/local/kong/下面有nginx-kon…

    2022年6月4日
    165
  • 外汇平台搭建,外汇交易社区,外汇支付通道,通过区块链如何改变外汇「建议收藏」

    外汇平台搭建,外汇交易社区,外汇支付通道,通过区块链如何改变外汇「建议收藏」在过去几年中,由区块链驱动的比特币对全球财务,特别是外汇行业产生了重大影响。这种创新的加密货币在全球范围内大肆挥霍,并成为头条新闻,很快就能感受到它的存在。虽然比特币很可能继续对外汇行业产生影响,但它实际上是锁定链,这种货币背后的技术,将对外汇行业产生更显着和不可逆转的影响。外汇产业的当前景观外汇市场是全球最大,最具流动性的市场。该行业每周五天,每天24小时开放,主要位于伦敦,而纽约市的每日…

    2025年10月24日
    4
  • python产生随机数的方法_产生随机数的函数

    python产生随机数的方法_产生随机数的函数Python产生随机数:一.Python自带的random库1.参生n–m范围内的一个随机数:random.randint(n,m)2.产生0到1之间的浮点数:random.random()3.产生n—m之间的浮点数:random.uniform(1.1,5.4)4.产生从n—m间隔为k的整数:random.randrange(n,m,k)5.从序列中随机选取一个元素:random.choice([1,2,3,4,5,6,7

    2022年10月4日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号