美文网首页
c++之多态

c++之多态

作者: 全村的卡密 | 来源:发表于2020-03-12 15:17 被阅读0次

父类指针、子类指针

  • 父类指针可以指向子类的对象


    image.png

多态

  • 同一操作作用于不同对象,可以有不同的解释,产生不同的执行结果。
  • 默认情况下,c++只会根据指针类型调用对应的函数,不存在多态。
Animal *p = new Cat();
//并不会调用 cat 的函数,而是调用animal的函数。

c++通过虚函数实现多态

  • virtual声明虚函数
  • 父类如果写了虚函数,那么子类对应函数也是虚函数,不需要写virtual.
class Animal{
public:
  virtual void run(){
  cout<<"animal run"<<endl;
  }
class Cat{
  void run(){
  cout<<"cat run"<<endl;
  }
}

重写(override)

  • 子类函数对父类函数的覆写。

多态的要素

  • 子类重写父类的成员函数(override)
  • 父类指针指向子类对象
  • 利用父类指针调用(重写的)成员函数

虚函数与普通函数的汇编区别


speak()是普通函数,run()是虚函数。

虚函数原理

使用sizeof计算虚函数占用内存大小,发现它比普通函数大了4个字节(x86),是因为其中有一个指向虚表的指针。

虚表

  • 虚表存储着最终需要调用的虚函数指针


    image.png
image.png

结合上表,就能理解汇编代码


image.png
image.png image.png

调用父类成员函数

父类::函数名

animal::speak();

虚析构函数

  • 如果存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数)
  • delete父类指针时,才会调用子类的析构函数,保证析构的完整性

纯虚函数

  • 没有函数体且定义为0的的虚函数,用来定义接口规范
virtual void run() = 0;

抽象类

  • 含有纯虚函数的类,不可以实例化
  • 如果父类是抽象类,而子类没有完全重写纯虚函数,子类依然是抽象类

多继承

  • c++允许一个子类有多个父类,但是不建议使用,增加复杂性。
  • 如果子类继承的多个父类有虚函数,则子类会有多个虚表。

虚继承

虚继承能解决菱形继承的问题(变量冗余)


image.png image.png image.png

相关文章

  • 深刻剖析之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/cevmdhtx.html