浅谈多态

1.什么是多态?

     就是不同的对象去完成不同的行为,就会产生不同的结果。

2.重载,重写(覆盖),重定义(隐藏)的区别?

     重载:(1)在同一作用域;

                (2)只要函数名相同,参数不同的两个函数就构成重载;

     重写(覆盖):

                (1)两个函数分别在基类和派生类的作用域;

                (2)函数的返回值/函数名/参数/ 都必须相同;

   (协变也是重写的一种)返回值可以不同,但返回值必须是基类或派生类的引用或指针

                (3)函数必须是虚函数,为了实现多态;

    重定义(隐藏):

                (1)两个函数分别在基类和派生类的作用域

                (2)只要函数名相同即可

3.多态的实现原理?

   虚函数表;

   单重继承:派生类先继承基类的虚函数表再将重写的函数一覆盖,最后将自己的虚函数放在虚表的后边

多重继承:派生类就会有各个基类的虚表,将重写的函数覆盖到各个基类的对应函数上,最后将自己的虚函数放在第一个虚表的后边。

 4. inline函数可以是虚函数吗?

     不能,因为inline函数没有地址(直接在调用的地方展开),无法把地址放到虚函数表中。

5.静态成员可以是虚函数吗?

    不能,因为静态成员没有this指针,无法访问类的虚函数表。

6.构造函数可以是虚函数吗?

   不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才进行初始化的

7.析构函数可以是虚函数吗?

   最好将基类的析构函数定义为虚函数,因为在编译的时候,编译器会把所有的析构函数名称统一处理成destructor,就直接构成了重写,在析构对象的时候,就可以多态的完成析构,避免了内存泄漏的问题。

8.虚函数表是在啥时候生成的,存在哪?

  在编译阶段就会生成所有对象共享该表,存在只读的数据段中。

9.虚拟继承和虚函数?

   虚拟继承是解决派生类中的数据冗余和二义性问题(菱形继承);

   虚函数的目的是实现多态

 (1)调用函数的对象必须是指针或引用

 (2)被调函数必须是虚函数,且完成了重写。

10.什么是抽象类,抽象类的作用?

     包含纯虚函数的类叫抽象类,例如: virtual  void test() = 0; 

     特点:且抽象类不能实例化出对象,其派生类也不行,只有重写纯虚函数,派生类才能实例化出对象。

     作用:强制重写纯虚函数,体现了接口继承

c++11中的两个关键字

final  修饰的虚函数不可以被重写;

override 修饰派生类虚函数强制重写,否则编译不通过。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值