博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 虚继承与继承的差异 (转)
阅读量:5009 次
发布时间:2019-06-12

本文共 1393 字,大约阅读时间需要 4 分钟。

转自:CSDN

原文链接:

前面一篇文章,说明了在。经过仔细推敲,发现没有彻底说清楚虚继承与普通继承之间的关系。所以用下面的文字再说明一下。

首先,重复一下虚拟继承与普通继承的区别有:

假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;

假设derived 虚继承自base类,那么derivd与base是一种“has a”的关系,即derived类有一个指向base类的vptr。

因此虚继承可以认为不是一种继承关系,而可以认为是一种组合的关系。因为虚继承有着“继承”两个关键字,那么大部分人都认为虚继承与普通继承的用法没什么太大的不同。由此用在继承体系中,这种将虚继承认为是普通继承的危害更佳大。下面先用一个例子来说明问题:

 

class base{public:    base(){cout<<"base::base()!"<

 

 

上面是普通继承实现,在实际应用中,我们可以使用下面的代码进行类型转换:

 

 
int main(int argc, const char * argv[]){    derived oo;    base oo1(static_cast(oo));    oo1.printBase();    derived oo2 = static_cast
(oo1); oo2.printDerived(); return 0;}

 

编译无错误,而且会得出正确的结果。其结果为:
base::base()! derived::derived()! base::printBase()! derived::printDerived()!

 

 

而将上面的普通继承变成虚拟继承,如下代码:

 

class base1{public:    base1(){cout<<"base::base()!"<
(oo)); oo1.printBase(); derived1 oo2 = static_cast
(oo1); oo2.printDerived(); return 0;}

 

编译上面的代码,提示如下:

 

可以看到不能将基类通过static_cast转换为继承类。我们知道c++提供的强制转换函数static_cast对于继承体系中的类对象的转换一般是可行的。那么这里为什么就不可以了呢?还是需要从虚拟继承的内部实现来说明问题。

 

virtual base class的原始模型是在class object中为每一个有关联的virtual base class加上一个指针vptr,该指针指向virtual基类表。有的编译器是在继承类已存在的virtual table直接扩充导入一个virtual base class table。不管怎么样由于虚继承已完全破坏了继承体系,不能按照平常的继承体系来进行类型转换。

不管怎么样,虚继承在类型转换是一定要十分注意。不要轻易使用虚继承,更不要在虚继承的基础上进行类型转换,切记切记!

转载于:https://www.cnblogs.com/panweishadow/p/3350712.html

你可能感兴趣的文章
如何提高编程水平
查看>>
Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
查看>>
Linux查看进程的内存占用情况 分类: ubuntu ...
查看>>
[BZOJ 2818]Gcd
查看>>
FORM值传递与地址传递
查看>>
(译)yaml快速教程
查看>>
C:大数相加
查看>>
160. Intersection of Two Linked Lists
查看>>
人生苦短,我用python-- Day11
查看>>
JAVA Bean
查看>>
ehcache memcache redis 三大缓存男高音_转
查看>>
curd_3
查看>>
百度地图API示例之设置地图显示范围
查看>>
Java构造方法、重载及垃圾回收
查看>>
.Net Core AES加密解密
查看>>
Spring Quartz实现任务调度
查看>>
python | 桶排序、冒泡排序、选择排序、去重
查看>>
两个Html页面之间值得传递
查看>>
EasyUI datagrid 的多条件查询
查看>>
Mac升级bash到最新版本
查看>>