美文网首页
C++——多态

C++——多态

作者: StevenHD | 来源:发表于2020-11-07 18:33 被阅读0次

一、多态的意义

  • 针对同一种行为,表现出了多种形态
  • 多继承解决了多个父类中的重复成员只需要保留一份的问题

二、多态实现的前提——赋值兼容

  • 必须public继承才能使用多态

赋值兼容只会发生在公有派生父子关系

  1. 子类对象赋给父类的对象
  2. 子类对象赋给父类的引用
  3. 子类对象的地址赋给父类的指针

三、函数重载是静多态

相同的函数名,不同的参数列表

编译的时候其实就把函数名改变了——

函数重载的本质

四、动多态

4.1 如何证明动多态不是在编译时确定的

动多态在运行时确定的证明

4.2 override

  • overload——同一个作用域中,函数名相同,参数列表不同
  • shadow——发生在父子类中的同名成员(数据or函数)
  • override——发生在父子类中,父类中函数有virtual声明的函数,在子类中,同参,同名,同返回的返回,二者之间构成了override。
  1. 多态在涉及到赋值兼容的时候,用得最多的还是指针
  2. 虚函数的访问权限,并不一定一定要跟父类一样是public,也可以是private或protected,具体看子类的需求。

五、纯虚函数

  • 拥有纯虚函数的类称为抽象基类,这个抽象基类是不可以实例化对象

作用是提供族类的公共接口

  • 纯虚函数也不可以进行实现,但是可以进行重写。
  • 虚基类是在多继承中的,里面有一个虚继承

六、含有虚函数的析构

6.1 栈上的构造与析构

栈上的构造和析构
栈上的构造和析构的结果
  • 这个构造和析构的顺序与我们预想的一样

6.2 堆上的构造与析构

堆上的相应操作
堆上的相应操作的结果

可以看到,没有~Dog(),说明析构不完全。那么如何析构完全呢?

  • 答案是引入虚析构

6.3 虚析构

  • 虚析构——就是为了析构完全,在delete父类指针的时候,将子类对象析构完全(调用子类的析构器)。
    虚析构
虚析构的结果

6.4 静态函数不能是虚函数

因为要实现多态,一定要有对象。但是静态函数属于类,不属于对象

6.5 内联函数不能是虚函数

  • 虚函数是动态的
  • 内联函数是要被内嵌的,是在编译时候搞的。

相关文章

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • 多态的C++实现

    多态的C++实现 1 多态的原理 什么是多态?多态是面向对象的特性之一,只用父类指针指向子类的对象。 1.1 多态...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • C++第六篇多态

    C++中的多态性分为编译时多态性和运行时多态性,编译时多态通过函数重载和模板体现,运行多态通过虚函数体现编译、连接...

  • 面试题目收集总结

    C++: 多态: 多态性都有哪些?(静态和动态,然后分别叙述了一下虚函数和函数重载) c语言和c++有什么区别?(...

  • C++的多态

    C++三大特性:封装、继承和多态。其中最好理解的就是封装了,继承作为C++面向对象的特征也不难理解,那么多态,应该...

  • 实现golang语言的多态

    如何实现golang语言的多态? C++里面有多态是其三大特性之一,那么golang里面的多态我们该怎么实现? g...

  • Swift 多态实现探究

    多态 父类指针指向子类对象 Swift 中多态的实现类似于 c++ 中的虚表 OC 多态实现利用的是 Runtim...

  • C++编译期多态和运行期多态

    C++多态有多种实现方式,在面对对象编程时,采用的是运行期多态,也称动态多态。在泛型编程中,多态基于模板的具现化与...

  • c++多态

    什么是多态性? 多态:相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。C++支持两种多态性:编译时多态...

网友评论

      本文标题:C++——多态

      本文链接:https://www.haomeiwen.com/subject/owmfbktx.html