patrick_star 的博客

欢迎来看!

类的继承与访问

一丶类的继承与多态
知识点1:面向对象程序设计的三个基本概念:数据抽象、继承和动态绑定(核心概念)
数据抽象:将类的接口与实现分离
继承:我们可以定义与其他类相似但完全不相同的新类
动态绑定:在使用这些彼此相似的类时,在一定程度上忽略他们的区别,统一使用它们的对象

知识点2:类的继承构成一种层次关系,在层次根部的为基类,其他类则直接或者间接的从基类中继承而来,称为派生类
基类负责定义在层次关系中所有类共有的数据成员,而派生类定义各自特有的成员

知识点3:对于某些函数,基类希望它的派生类各自定义适合其自身的版本,基类会将该函数声明为虚函数!!!而派生类必须在其内部对所有重新定义的虚函数进行声明,若不加virtual关键字,可以在其后加上override显式声明改写基类的虚函数

知识点4:派生类必须通过使用类派生列表明确指出它是从哪个基类中继承而来的:冒号+(访问限定符)基类列表

知识点5:动态绑定,函数的运行版本由实参决定也被称为运行时绑定:在使用基类的引用调用一个虚函数时将会发生动态绑定!!!当我们使用指针或者引用调用虚函数时,将调用动态绑定

知识点6:基类通常应该定义一个虚析构函数,即使该函数不执行任何操作也是如此!

知识点7:关键词virtual只能出现在类内的声明函数语句之前,而不能用于类外部的函数定义,在派生类中相应的函数将隐式的是虚函数(不加virtual的情况)

知识点8:非虚函数,其解析过程将发生在编译时而非运行时

知识点9:protected受保护的成员,基类希望它的派生类有权访问该成员,同时禁止其他用户访问,而private即使是其派生类也不能访问
虚成员就是虚函数

& && const override noexcept这四个既要在申明处有,也要在定义处有
virtual 和 static 只需要在类中的声明处标记就可以了,类外的定义处不需要有!

成员函数中 const &/&& noexcept final override = 0 按照这样的顺序来

二丶派生类和基类
知识点1:派生类必须通过类派生列表指出它是从那个基类继承而来的
知识点2:派生类必须将其继承来的成员函数中需要覆盖的那些重新声明!!!
知识点3:大多数类只继承自一个类,被称作“单继承”,还有其他的类型在P710
知识点4:派生类拥有的成员包括自己定义的成员和继承自基类的相关成员,但是这两部分并不一定是连续存储的
知识点5:我们可以把派生类的对象当成基类的对象来使用,也可以将基类的指针或引用绑定到派生类对象中的基类部分上
知识点6:继承的关键:派生类中有基类的对应组成部分
知识点7:派生类需要使用基类的构造函数来初始化它的基类部分—每个类控制自己的初始化过程,派生类的构造函数同样是通过构造函数初始化列表将实参传递给基类的构造函数,再由基类的构造函数,完成其基类部分的初始化
知识点8:首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员
知识点9:派生类的作用域嵌套在基类的作用域之内,所以对于一个派生类的成员,其使用派生类成员和积累成员的方式相同—最好使用各自的接口
知识点10:若基类中定义了静态成员static,则在整个继承体系中只存在该成员的唯一定义,并且只有一份实例
知识点11:派生类的声明只能包含类名,不能包含它的派生列表:一条声明语句的目的是令程序知晓某个名字的存在以及该名字表示一个怎样的实体,派生列表以及其定义的相关细节必须与类的主体一起出现
知识点12:若要将一个类当作基类来使用,那么这个类就必须是已经定义过的,仅仅声明是不可以的,因为派生类需要知道其基类到底是什么,所以类不能派生其本身,最终的派生类将包含所有间接类的相关成员
知识点13:C++11新标准,防止类被继承可以在其类名后加final,表示其不能作为基类

三丶静态类型和动态类型
知识点1:当我们使用引用或者指针调用一个虚成员函数时才会执行动态绑定,因为我们知道在程序运行时才知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义
知识点2:引用和指针的静态类型与动态类型不同的这一事实是C++语言支持多态性的根本所在(必须是虚函数)
知识点3:一个派生类的函数成员如果覆盖了基类的继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致,返回类型也必须相匹配,但当类的虚函数的返回类型是类本身的指针或者引用时,返回类型可以不同
知识点4:派生类如果定义了一个与基类虚函数同名函数,但参数列表不相同的话,仍然是合法行为,编译器会认为该函数与基类虚函数是相互独立的,但这往往是把形参列表弄错了的错误,编译器发现不了,所以C++11有一个好东西,在其后加上override表示其要对基类的函数进行覆盖,若未覆盖,编译器报错,我们可以发现自己的错误
知识点5:虚函数可以有默认实参,若函数调用了默认实参,则实参值由静态类型决定,所以基类和派生类中定义的默认实参最好一致
知识点6:某些情况下,我们不希望进行动态绑定,我们可使用作用域运算符强行指定其执行哪个版本,进行回避虚函数—一般情况下是成员函数中的代码才需要以防止自己调用自身造成无限循环

四丶class和struct的区别
两个唯一的差别,就是默认成员访问说明符默认派生访问说明符的不同
struct两个默认为public
class两个默认为private

五丶类的访问权限的区别
知识点1:protected成员,类的对象用户不可访问,派生类和友元可访问
知识点2:派生类的成员只能通过派生类对象来访问基类的受保护成员!!!也就是说派生类不能访问基类对象的受保护成员
知识点3:派生类的成员和友元只能访问派生类对象中的基类的受保护部分,对于普通的基类对象的受保护成员不具有特殊的访问权限
知识点4:共有继承,继承自基类的成员在派生类中遵循原有的访问说明符,私有继承,继承而来的基类成员在派生类中变为private,变为私有,派生类的对象都不可以访问其本身的私有成员,但私有继承不影响派生类本身的访问权限,它同样不可以使用基类的私有成员。
知识点5:友元关系不能继承,每个类负责自己控制自己成员的访问权限
知识点6:当一个类将另一个类作为友元函数时,这种友元关系只对作出声明的类有效,对于原来的类来说,其友元的基类或派生类不具备特殊访问能力
知识点7:通过在类的内部使用using声明改变派生类继承的某个名字的访问权限,using语句中名字的访问权限由该using出现之前的访问说明符决定
知识点8:struct默认公有继承,private默认私有继承,但是我们最好将其显式的表明
知识点9:1: 假定B继承自A,无论B以什么方式继承A,B的成员函数和友元都能使用派生类到基类的转换
2: B继承A的方式是公有或者保护,则B的派生类的成员或友元可以使用B到A的转换,若未私有则不行
3: B继承A的方式是公有的,用户的代码才能使用B到A的(派生类到基类)的转换,保护或者私有方式则不行 P549页
阅读更多
版权声明:这个博客本人所写,如果你要用的话,和我私聊,没问题! https://blog.csdn.net/patrick_star_cowboy/article/details/79969868
个人分类: C++基础知识
上一篇“error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载他人加上自己独特的理解,希望能对你有所帮助)
下一篇虚函数(虚析构函数)与作用域
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭