面试中常被问到封装继承多态知多少
Posted AllenSquirrel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到封装继承多态知多少相关的知识,希望对你有一定的参考价值。
面向对象(oop)
面向对象技术三大特性:封装,继承,多态
-
封装
封装的概念体现在类抽象和对象实例化,封装就是将数据和对数据的操作封装在一个类中,用类对数据进行了抽象
-
继承
(1)如果两个类的关系存在一种所属关系,则可以把二者一个作为基类,一个作为派生类
(2)继承的本质就是代码复用,在继承关系中,如果派生类没有明确显示定义“构造,拷贝构造,析构,赋值运算符重载,取地址操作符重载,const修饰的取地址运算符重载”这6个函数,会自动合成,除构造和析构外,其余所有成员均可继承为派生类所用
(3)调用派生类构造函数,在其构造函数的初始化列表处调用基类构造函数,完成基类构造函数及成员初始化(赋值)之后,返回并完成派生类构造函数及剩余部分成员初始化(赋值)
(4)调用派生类析构函数,等派生类析构函数执行结束后再调用基类析构函数执行
(5)派生类对象可以赋值或初始化基类对象,多余部分会截断处理,但基类对象不可以赋值或初始化派生类对象,因为派生类部分成员基类中不存在
(6)基类指针或引用可以指向派生类对象,反之则不行,但C++11支持dynamic_cast类型转换,可以使得派生类对象或引用指向基类对象
(7)友元关系不可以被继承,同时基类中如果定义static成员,则整个继承体系中只保持这一个成员,无论派生出多少个子类,都只有一个static成员,因此所有类对象共享一个static成员,static成员不属于任何一个类,因此需要在类外完成初始化操作
(8)在继承体系中基类和派生类都有独立的作用域。当子类和父类中有同名成员,子类成员将屏蔽父类成员的直接访问,即隐藏,如果在基类同名函数添加virtual关键字,则构成覆盖,即为多态形成。
-
多态
(1)静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,这就是静态的,也就是说地址是早早绑定的,静态多态也往往被叫做静态联编。往往通过函数重载来实现,调用速度快,效率高但缺乏灵活性。
(2)动态多态则是指函数调用的地址不能在编译器期间确定,必须需要在运行时才确定,这就属于晚绑定,动态多态也往往被叫做动态联编。通过虚函数来实现,虚函数允许派生类重新定义成员函数,而派生类重新定义基类的做法称为覆盖或称为重写。
(3)C++下多态特性一般指动态多态,此时所产生的多态概念就可以理解为:在不同继承关系下的类对象去调用同一函数所产生的不同行为
(4)理解重载(overload)与覆盖(重写override)以及隐藏
- 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。覆盖要求函数名、参数列表、返回值必须相同。
- 在类中重载是同一个类中不同成员函数之间的关系。在类中覆盖则是子类和基类之间不同成员函数之间的关系。
- 重载函数的调用是根据参数列表来决定调用哪一个函数。覆盖函数的调用是根据对象类型的不同决定调用哪一个。
- 在类中对成员函数重载是不能够实现多态。在子类中对基类虚函数的覆盖可以实现多态。
- 隐藏是指派生类的函数屏蔽了与其同名的基类函数。如果派生类的函数与基类的函数同名,但参数不同,则无论有无virtual关键字,基类的函数都被隐藏。如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时基类的函数被隐藏,否则构成覆盖
(5)继承关系下构成多态的两大必要条件:1,必须通过基类指针或引用调用虚函数 2,被调用函数必须是虚函数,并且派生类必须对虚函数进行重写
以上是关于面试中常被问到封装继承多态知多少的主要内容,如果未能解决你的问题,请参考以下文章