C++虚继承和虚函数

作者: XDgbh | 来源:发表于2018-06-14 22:19 被阅读6次
  • 虚继承是指在类继承时,使用关键字virtual,如class B : virtual public A { ... };,这样在类B中就会增加一个指针vbptr(virtual base pointer)虚基类指针。该指针指向一个vbtable虚基表,表中保存的是类A的成员变量在类B中的偏移量(地址相差的字节数),而不是保存的一个地址。虚继承使得在菱形多继承时,子类D中只保存一份基类A的数据拷贝。如果不用虚继承会使得子类D从两个渠道保存两份基类A的数据拷贝,而且会使得多态操作A类型指针指向D类实例对象时报错,有歧义。
    菱形继承

详情参见博文:https://blog.csdn.net/xiejingfa/article/details/48028491
更深入的:https://blog.csdn.net/littlehedgehog/article/details/5442430

  • 虚函数是指父类中的成员函数,若允许被子类重写override覆盖(和重载有区别,重载是函数名相同参数不同,重写是函数名和参数都相同只是内部实现不同),那么就要用virtual关键字来修饰函数如virtual int getSum(){ return sum; };。这样类A中以及子类中都会有一个vptr虚指针,用来指向一个vtable虚表,表中存放的是虚函数的地址,而不是偏移量。注意:虚函数也是可以有函数体和执行内容的。它虚就虚在所谓“推迟联编”或者“动态联编”上,在多态应用场景中,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
  • 纯虚函数,是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都必须要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”,如virtual int getSum()=0;。拥有纯虚函数的类是抽象类,不能实例化对象,只能用于被子类继承然后必须重写实现该纯虚函数的方法体。

相关文章

  • C/C++32位与64位数据类型占用的字节数

    C++继承、虚继承、虚函数类的大小问题

  • 虚继承和虚函数

    虚继承和虚函数 虚继承和虚函数是毫不相关的两个概念,但是在实现上又有所类似;虚函数是C++中实现多态的一个重要手段...

  • C++语言-多态,纯虚函数,模版函数

    1、虚函数、纯虚函数 需要注意的是,纯虚函数子类是必须继承的,虚函数不是不必须继承的。 2、多态 在C++中默认关...

  • C++虚继承和虚函数

    虚继承是指在类继承时,使用关键字virtual,如class B : virtual public A { ......

  • 08. 纯虚函数、抽象类、多继承、菱形继承、虚

    一.虚函数 二.纯虚函数 三,虚析构函数 四.纯虚函数 五,多继承 六.多继承-虚函数 七.菱形继承 八. 虚继承...

  • C++面向对象

    小结 虚函数是virtual声明的。实现动态链接的功能。 纯虚函数是没有函数主体的虚函数。 一、C++继承 1.当...

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

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

  • C++虚函数和虚继承探秘

    什么是继承?什么是多重继承?多重继承存在变量和函数名冲突怎么办?子类对象和父类对象的内存模型是什么样的?虚继承如何...

  • 虚函数

    虚函数 Inheritance (继承) with virtual functions (虚函数) 非虚函数:继承...

  • 2020-02-10 C++基础2

    1:为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 将可能会被继承的父类的析构函数设置为虚...

网友评论

    本文标题:C++虚继承和虚函数

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