C++中虚函数与虚继承区别浅析笔记

虚继承和虚函数是完全无相关的两个概念。

虚函数:是在函数声明/定义时,必须加上virtual关键字。作用就是让其派生类能够覆盖此函数,从而实现多态(运行时多态)。

补充:编译时多态性:通过重载函数和运算符重载实现。运行时多态性:通过虚函数和继承实现。

还有一点就是在派生类中,继承基类同名的虚函数后,不管派生类中显示写不写virtual,此函数依然是虚函数

还有一种纯虚函数。纯虚函数在基类中没有定义,没有具体的实现。他把实现工作交给了派生类(大部分情况)。此时这个含有纯虚数的类称为抽象类,这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的的纯虚函数,否则,派生类也变成了抽象类,不能实例化对象。

virtual void functions(int data)=0; //纯虚函数,必须被派生类实现
virtual void func(int data){cout<<"class A :"<<data<<endl;}

虚继承:是在继承时是一种继承方式,虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性。

虚继承可以解决上面两个问题,其虚继承底层实现原理与编译器相关,一般通过虚基类指针虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时虚基类指针也会被继承。

vbptr指的是虚基类表指针(virtual base table pointer)该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。

虚函数与虚继承对比:都用了虚指针和虚表。虚指针占用类空间,虚表都不占用。

                                    虚基类依旧存在继承类中,只占用存储空间;虚函数不占用存储空间。

                                    虚基类表存储的是虚基类相对直接继承类的偏移;而虚函数表存储的是虚函数地址。

****此篇博客有关于虚继承详细的内存分布情况

http://blog.youkuaiyun.com/xiejingfa/article/details/48028491(学习必备)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值