C++之多态及RTTI初识

  • 继承的缺点:关联性太强了(父类改变一个函数参数,则所有子类都需要改变)
  • 所有的类不能够将其写的太实,(扩展性)

1、多态

  1. 纯虚函数 ---- 接口
    1. 含有纯虚函数的类叫做抽象类 --- 实现抽象层,隔离变化的部分与不变化的部分----依赖倒立原则
    2. 子类如果没有实现纯虚函数,则子类也叫作抽象类
    3. 子类中实现纯虚函数的成员函数也是几个虚函数
  2. 具体类 ------> 抽象类 (只将可能发生变化的方法抽象化)
  3. 面向对象和面向过程面试题?
    1. 面向过程它主要的是更加注重一件事情完成的具体步骤,以及各个步骤之间的关联,这种关联会导致各个代码块之间紧密联系(可以举出函数参数在各个函数之间的调用,一个变量作为多个函数的参数),不利于程序后期的维护;
    2. 而面向对象则更加注重事物的独立性,将每一个发出动作的事物都实例化成一个class,而且每一个class中还有不同的访问权限以用来保证各个部门的相互独立,这样可以保证各个代码块之间的相互独立,能够快速的定位bug,后期可以更好地维护程序。
  4. 如何用c实现面向对象?
    1. 实现封装:将方法和属性打包到一个struct中,但是无法实现控制访问权限
    2. 实现继承:继承主要是为了代码的复用性,
      1. 一般的继承:将基类的对象放入到派生类的struct中;
      2. 虚继承:解决多继承带来的二义性,一般虚基类中会有一个虚函数表,对应的类对象中包含一个指向虚函数表的虚指针;
    3. 多态:???
  5. RTTI(运行时类型信息):在程序运行时,可以获取某个对象及变量的类型;
    1. 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;
	}
    1. dynamic_cast< > (); 支持向下类型转型,同时也支持向上类型转型;
      • pb(子类指针)= pt(父类指针) 向下转型(必须实现多态);
      • 进行类型检查;
      • 转换出错:指针-----出错则返回nullptr, 引用-------出错则抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值