在讨论之前我们先建立一个类的继承层次模型:
class Base1 {
public:
Base1(void) {
cout << "class Base1" << endl;
}
};
class Base2 {
public:
Base2(void) {
cout << "class Base2" << endl;
}
};
class Level1:virtual public Base2,public Base1 {
public:
Level1(void) {
cout << "class Level1" << endl;
}
};
class Level2:public Base2,virtual public Base1 {
public:
Level2(void) {
cout << "class Level2" << endl;
}
};
class Leaf:public Level1,virtual public Level2 {
public:
Leaf(void) {
cout << "class Leaf" << endl;
}
};
int main(void) {
Leaf obj;
return 0;
}
不看下面的分析,大家觉得输出结果应该是怎么样的?如果没有虚拟继承,也许能很快说出答案。
现在来分析一下在多继承和虚拟继承的情况下,构造函数的调用顺序是怎么样的。
编译器按照直接基类在声明中的顺序,来检查虚拟基类的出现情况。在我们的例子中,Level1首先被检查,然后是Level2。每个继承子树按照深度优先的顺序被检查。即,查找从树根类开始,然后向下移动。如对子树Level1而言,先检查Base2,然后是Base1,再到Level1。但是在虚拟继承中,基类构造函数的查找顺序只是为了知道虚拟继承的情况而已,基类构造函数的调用顺序和查找顺序是不一样的,那应该遵循什么样的一个原则呢
遵循两个原则,而且按顺序优先满足:1 先调用完所以基类,再调用子类;2 先调用虚拟基类,再调用非虚拟基类。
一旦调用了虚拟基类的构造函数,则非虚拟基类构造函数就按照声明的顺序被调用。
所以针对我们这个例子,因为声明类Leaf的顺序是先Level1后Level2,所以先看看Level1这棵子树吧。
由于Level1虚拟继承Base2,非虚拟继承Base1,所以应该先调用Base2,但是这之后不能接着调用Level1这棵子树的Base1,因为其他子树还有虚拟继承。
现在来看看Level2这棵子树吧,由于Level2虚拟继承Base1,非虚拟继承Base2,所以先调用Base1,后Base2。既然Level2的两个基类都调用了,并且Level2也是一个虚拟基类,所以现在应该调用Level2的构造函数了。
这样,Level2这棵子树的构造函数都调用完了,又回到Level1这棵子树了。接着刚才,由于Level1的Base2已经调用了,接着应该调用Base1了,之后是Level1。
当Leaf的所有直接和间接的基类都调用之后,最后是Leaf构造函数了。
经过以上分析,大家应该知道构造函数的调用顺序了吧,所以该程序的输出应该是
Base2
Base1
Base2
Level2
Base1
Level1
Leaf
转载:原文由zwylinux发表
因为Soutsh的对象s有两个基类子对象。这两个基类子对象本来都有一个north类型的子对象。即South含有两个north类型的子对象。但是由于是虚继承。故只有一个。同样道理。假设South从3个类继承。这三个类都有north基类子对象。结果South依然只是间接的有一个north子对象。
不能说是缺点,只能说是特点。 B、C虚继承A的话,那么任何继承B、C的类都得指定如何构造其中包含的A。
如果不是继承,那么类B、C分别各自指明如何构造其中包含的A,继承B、C的类无需再指明也不能指明如何构造其中包含的A。
随着互联网时代的崛起,网民在虚拟世界留存的痕迹已经不仅仅是数据本身,其背后产生的经济价值、情感价值,以及在网民过世后这些数据的归宿问题开始受到人们的关注。
但由于当前相关法律的空白,这些涉及隐私的信息数据还存在诸多争议。至于是否可由亲属继承依然存在部分争议。这里先列举一些外国措施,以此参考。
美国、德国等国家明确规定了虚拟财产的遗产继承权。美国俄克拉荷马州在2010年11月1日通过了一项法律,将虚拟财产纳入到了遗嘱执行范围中。比如对上传的数字像片、往来的电子邮件等,如死者在生前没有就去世后的虚拟财产作出明确的处置说明,法院将根据情况决定它的合法继承人;在德国,虚拟财产是按照普通继承财产统一管理的,在认证有金钱价值时,在死者死后10年内,其虚拟财产的财产权都会受到法律保护。
在韩国,直接将虚拟财产认定为财产,属于物权法上的“物”,具有物的属性。韩国法律规定网络游戏中的虚拟角色和虚拟物品独立于服务商而具有财产价值,服务商只是为玩家的这些私有财产提供一个存放场所,而无权对其做肆意修改或删除。因此,在韩国法律中,虚拟财产的性质与银行账号中的财产本质上并无差别。韩国把虚拟财产等同于“电子货币”,具有物的属性。
英国。在英国有很多人已经意识到虚拟财产的重要性,他们采取立遗嘱的方式来分配自己的虚拟财产,因为他们认为虚拟财产有其自身的价值。有的虚拟财产承载了个人感情,例如个人照片和视频等; 有的是用现实的货币买来的,例如网上游戏装备等等。英国的一项调查显示: 每10 个英国人中就有一个人声称会将自己的网络密码写进遗嘱里,这样他们的家人和朋友就可以在其去世之后继续保存这些虚拟财产。
而在国内,随法律没有明确判定条例,但其网络资产也被认定为是个人财产。网络服务提供商一般会在《用户使用协议》中规定,用户只对账号有使用权,没有所有权。显然这种协议忽视了虚拟财产的财产属性,已经不符合时代,应当予以修改。
另外当被继承人死亡后留有合法有效的遗嘱时,可以采取遗嘱继承的方式分割虚拟财产。被继承人在生前亲自将自己所拥有的虚拟财产进行处分,指定了继承人。在被继承人去世后,由遗嘱执行人来分配虚拟财产。
以上就是关于c++ virtual虚基类继承的优先性问题全部的内容,包括:c++ virtual虚基类继承的优先性问题、谁能帮我解答一下关于c++虚继承情况下的强制类型转换原理、c++虚继承有什么缺点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)