3 继承和派生

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FAKER_0X0/article/details/89406488

3 继承和派生

#知识点总结#

3.1继承概念

类之间的关系
has-A:一个类中的数据成员是另一种已经定义的类
uses-A:通过类之间成员函数的相互联系,定义友员或对象参数传递实现
is-A:继承,关系具有传递性,不具有对称性

子类拥有父类的所有成员变量和成员函数
子类可以拥有父类没有的方法和属性
子类就是一种特殊的父类
子类对象可以当作父类对象使用

3.2派生类的访问控制

派生类继承了基类的全部成员变量和成员方法(除了构造和析构之外的成员方法)
public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员

“三看”原则
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)

需要被外界访问的成员直接设置为public
只能在当前类中访问的成员设置为private
只能在当前类和子类中访问的成员设置为protected
项目开发中一般情况下是public

3.3继承中的构造和析构

3.3.1类型兼容性原则

类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
类型兼容规则中所指的替代包括以下情况:
1)子类对象可以当作父类对象使用
2)子类对象可以直接赋值给父类对象
3)子类对象可以直接初始化父类对象
4)父类指针可以直接指向子类对象
5)父类引用可以直接引用子类对象
在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。
总结:子类就是特殊的父类 (base *p = &child;)

3.3.2继承中的对象模型

子类是由父类成员叠加子类新成员得到的

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

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

1、子类对象在创建时会首先调用父类的构造函数
2、父类构造函数执行结束后,执行子类的构造函数
3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
4、析构函数调用的先后顺序与构造函数相反

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

组合对象:类A中含有成员变量类B,类A构造函数需使用初始化列表初始化类B

原则: 先构造父类,再构造成员变量、最后构造自己
先析构自己,在析构成员变量、最后析构父类
//先构造的对象,后释放

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

当子类成员变量与父类成员变量同名时,子类依然从父类继承同名成员,在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符),同名成员存储在内存中的不同位置。

派生类的重名成员屏蔽基类的同名成员
b1.b;和b1.B::b;一样 b1.A::b;
总结:同名成员变量和成员函数通过作用域分辨符进行区分

3.3.6派生类中的static关键字

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

总结:
static函数也遵守3个访问原则
static易犯错误(不但要初始化,更重要的显示的告诉编译器分配内存)
int B::i=0; (基类的static成员)
例程的问题:构造函数默认为private

3.4多继承

在项目中不常用,了解即可!

多继承概念
一个类有多个直接基类的继承关系称为多继承
class C: public A, public B

多继承的派生类构造和访问
多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员
执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。

多继承的二义性和虚继承
1)如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。
2)如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象。
3)要使这个公共基类在派生类中只产生一个子对象,必须对这个基类声明为虚继承,使这个基类成为虚基类。
4)虚继承声明使用关键字virtual

改正后:

实验:注意增加virtual关键字后,构造函数调用的次数。基类构造函数只执行一次,否则执行两次。
加上virtual以后,C++编译器会给变量偷偷增加属性。

猜你喜欢

转载自blog.csdn.net/FAKER_0X0/article/details/89406488