C++虚继承和虚函数
2018-06-14 本文已影响6人
XDgbh
- 虚继承是指在类继承时,使用关键字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;
。拥有纯虚函数的类是抽象类
,不能实例化对象,只能用于被子类继承然后必须重写实现该纯虚函数的方法体。