- 继承的缺点:关联性太强了(父类改变一个函数参数,则所有子类都需要改变)
- 所有的类不能够将其写的太实,(扩展性)
1、多态
- 纯虚函数 ---- 接口
- 含有纯虚函数的类叫做抽象类 --- 实现抽象层,隔离变化的部分与不变化的部分----依赖倒立原则
- 子类如果没有实现纯虚函数,则子类也叫作抽象类
- 子类中实现纯虚函数的成员函数也是几个虚函数
- 具体类 ------> 抽象类 (只将可能发生变化的方法抽象化)
- 面向对象和面向过程面试题?
- 面向过程它主要的是更加注重一件事情完成的具体步骤,以及各个步骤之间的关联,这种关联会导致各个代码块之间紧密联系(可以举出函数参数在各个函数之间的调用,一个变量作为多个函数的参数),不利于程序后期的维护;
- 而面向对象则更加注重事物的独立性,将每一个发出动作的事物都实例化成一个class,而且每一个class中还有不同的访问权限以用来保证各个部门的相互独立,这样可以保证各个代码块之间的相互独立,能够快速的定位bug,后期可以更好地维护程序。
- 如何用c实现面向对象?
- 实现封装:将方法和属性打包到一个struct中,但是无法实现控制访问权限
- 实现继承:继承主要是为了代码的复用性,
- 一般的继承:将基类的对象放入到派生类的struct中;
- 虚继承:解决多继承带来的二义性,一般虚基类中会有一个虚函数表,对应的类对象中包含一个指向虚函数表的虚指针;
- 多态:???
- RTTI(运行时类型信息):在程序运行时,可以获取某个对象及变量的类型;
- std : : type_info ------ 通过typeid(),返回type_info类对象的引用
cout << typeid().name() << endl;
-
- 注意事项:不要将typeid作用于指针,应该作用于引用,或者解引用的指针(*p);
- type_info重载了操作符==,!=,分别用来比较是否相等、不等,函数name()返回类型的名称。
if(typeid(*p) == typeid(Child)) //基类指针指向派生类时才可以转换(重载了"=="(typeid返回的是一个对象))
{
cout << "可以转换" << endl;
}
else
{
cout << "不可以转换" << endl;
}
-
- dynamic_cast< > (); 支持向下类型转型,同时也支持向上类型转型;
-
-
- pb(子类指针)= pt(父类指针) 向下转型(必须实现多态);
- 进行类型检查;
- 转换出错:指针-----出错则返回nullptr, 引用-------出错则抛出异常。
-