关于房屋继承法法第二条的疑问

中华人民共和国继承法 全文 关于贯彻执行《中华人民共和国继承法》若干问题的意见-杨景明法律服务网
杨景明法律服务网
        
□ 站 内 搜 索 □
请输入查询的字符串:
==& 综合查询 &==
&|&|_法制新闻&|&|_法律常识&|&|_法律法规&|&|_网站公告&|&|_经典案例&|&|_业务范围&|&|_律师风采&|&|_法律文书
中华人民共和国继承法 全文 关于贯彻执行《中华人民共和国继承法》若干问题的意见
发布时间:
20:49:50 被阅览数: 55 次 来源:
杨景明法律服务网
自动滚屏(右键暂停)
中华人民共和国继承法
第一章 总 则
  第一条 根据《中华人民共和国宪法》规定,为保护公民的私有财产的继承权,制定本法。
  第二条 继承从被继承人死亡时开始。
  第三条 遗产是公民死亡时遗留的个人合法财产,包括:
  (一)公民的收入;
  (二)公民的房屋、储蓄和生活用品;
  (三)公民的林木、牲畜和家禽;
  (四)公民的文物、图书资料;
  (五)法律允许公民所有的生产资料;
  (六)公民的著作权、专利权中的财产权利;
  (七)公民的其他合法财产。
  第四条 个人承包应得的个人收益,依照本法规定继承。个人承包,依照法律允许由继承人继续承包的,按照承包合同办理。
  第五条 继承开始后,按照法定继承办理;有遗嘱的,按照遗嘱继承或者遗赠办理;有的,按照协议办理。
  第六条 的继承权、受遗赠权,由他的法定代理人代为行使。
  限制行为能力人的继承权、受遗赠权,由他的法定代理人代为行使,或者征得法定代理人同意后行使。
  第七条 继承人有下列行为之一的,丧失继承权:
  (一)故意杀害被继承人的;
  (二)为争夺遗产而杀害其他继承人的;
  (三)遗弃被继承人的,或者虐待被继承人情节严重的;
  (四)伪造、篡改或者销毁遗嘱,情节严重的。
  第八条 继承权纠纷提起诉讼的期限为二年,自继承人知道或者应当知道其权利被侵犯之日起计算。但是,自继承开始之日起超过二十年的,不得再提起诉讼。
  第二章 法定继承
  第九条 继承权男女平等。
  第十条 遗产按照下列顺序继承:
  第一顺序:配偶、子女、父母。
  第二顺序:兄弟姐妹、祖父母、外祖父母。
  继承开始后,由继承,不继承。没有第一顺序继承人继承的,由第二顺序继承人继承。
  本法所说的子女,包括婚生子女、非婚生子女、养子女和有扶养关系的继子女。
  本法所说的父母,包括生父母、养父母和有扶养关系的继父母。
  本法所说的兄弟姐妹,包括同父母的兄弟姐妹、同父异母或者同母异父的兄弟姐妹、养兄弟姐妹、有扶养关系的继兄弟姐妹。
  第十一条 被继承人的子女先于被继承人死亡的,由被继承人的子女的晚辈直系血亲代位继承。代位继承人一般只能继承他的父亲或者母亲有权继承的遗产份额。
  第十二条 丧偶儿媳对公、婆,丧偶女婿对岳父、岳母,尽了主要赡养义务的,作为第一顺序继承人。
  第十三条 同一顺序继承人继承遗产的份额,一般应当均等。
  对生活有特殊困难的缺乏劳动能力的继承人,分配遗产时,应当予以照顾。
  对被继承人尽了主要扶养义务或者与被继承人共同生活的继承人,分配遗产时,可以多分。
  有扶养能力和有扶养条件的继承人,不尽扶养义务的,分配遗产时,应当不分或者少分。
  继承人协商同意的,也可以不均等。
  第十四条 对继承人以外的依靠被继承人扶养的缺乏劳动能力又没有生活来源的人,或者继承人以外的对被继承人扶养较多的人,可以分给他们适当的遗产。
  第十五条 继承人应当本着互谅互让、和睦团结的精神,协商处理继承问题。遗产分割的时间、办法和份额,由继承人协商确定。协商不成的,可以由人民调解委员会调解或者向人民法院提起诉讼。
  第三章 遗嘱继承和遗赠
  第十六条 公民可以依照本法规定立遗嘱处分个人财产,并可以指定遗嘱执行人。
  公民可以立遗嘱将个人财产指定由法定继承人的一人或者数人继承。
  公民可以立遗嘱将个人财产赠给国家、集体或者法定继承人以外的人。
  第十七条 公证遗嘱由遗嘱人经公证机关办理。
  自书遗嘱由遗嘱人亲笔书写,签名,注明年、月、日。
  代书遗嘱应当有两个以上见证人在场见证,由其中一人代书,注明年、月、日,并由代书人、其他见证人和遗嘱人签名。
  以录音形式立的遗嘱,应当有两个以上见证人在场见证。
  遗嘱人在危急情况下,可以立口头遗嘱。口头遗嘱应当有两个以上见证人在场见证。危急情况解除后,遗嘱人能够用书面或者录音形式立遗嘱的,所立的口头遗嘱无效。
  第十八条 下列人员不能作为遗嘱见证人:
  (一)无行为能力人、限制行为能力人;
  (二)继承人、;
  (三)与继承人、受遗赠人有利害关系的人。
  第十九条 遗嘱应当对缺乏劳动能力又没有生活来源的继承人保留必要的遗产份额。
  第二十条 遗嘱人可以撤销、变更自己所立的遗嘱。
  立有数份遗嘱,内容相抵触的,以最后的遗嘱为准。
  自书、代书、录音、口头遗嘱,不得撤销、变更公证遗嘱。
  第二十一条 遗嘱继承或者遗赠附有义务的,继承人或者受遗赠人应当履行义务。没有正当理由不履行义务的,经有关单位或者个人请求,人民法院可以取消他接受遗产的权利。
  第二十二条 无行为能力人或者限制行为能力人所立的遗嘱无效。
  遗嘱必须表示遗嘱人的真实意思,受胁迫、欺骗所立的遗嘱无效。伪造的遗嘱无效。
  遗嘱被篡改的,篡改的内容无效。
  第四章 遗产的处理
  第二十三条 继承开始后,知道被继承人死亡的继承人应当及时通知其他继承人和遗嘱执行人。继承人中无人知道被继承人死亡或者知道被继承人死亡而不能通知的,由被继承人生前所在单位或者住所地的居民委员会、村民委员会负责通知。
  第二十四条 存在遗产的人,应当妥善保管遗产,任何人不得侵吞或者争抢。
  第二十五条 继承开始后,继承人放弃继承的,应当在遗产处理前,作出放弃继承的表示。没有表示的,视为接受继承。
  受遗赠人应当在知道受遗赠后两个月内,作出接受或者放弃受遗赠的表示,到期没有表示的,视为放弃受遗赠。
  第二十六条 夫妻在婚姻关系存续期间所得的共同所有的财产,除有约定的以外,如果分割遗产,应当先将共同所有的财产的一半分出为配偶所有,其余的为被继承人的遗产。
  遗产在家庭共有财产之中的,遗产分割时,应当先分出他人的财产。
  第二十七条 有下列情形之一的,遗产中的有关部分按照法定继承办理:
  (一)放弃继承或者受遗赠人放弃受遗赠的;
  (二)遗嘱继承人丧失继承权的;
  (三)遗嘱继承人、受遗赠人先于遗嘱人死亡的;
  (四)遗嘱无效部分所涉及的遗产;
  (五)遗嘱未处分的遗产。
  第二十八条 遗产分割时,应当保留胎儿的继承份额。胎儿出生时是死体的,保留的份额按照法定继承办理。
  第二十九条 遗产分割应当有利于生产和生活需要,不损害遗产的效用。
  不宜分割的遗产,可以采取折价、适当补偿或者共有等方法处理。
  第三十条 夫妻一方死亡后另一方再婚的,有权处分所继承的财产,任何人不得干涉。
  第三十一条 公民可以与扶养人签订遗赠扶养协议。按照协议,扶养人承担该公民生养死葬的义务,享有受遗赠的权利。
  公民可以与集体所有制组织签订遗赠扶养协议。按照协议,集体所有制组织承担该公民生养死葬的义务,享有受遗赠的权利。
  第三十二条 又无人受遗赠的遗产,归国家所有;死者生前是集体所有制组织成员的,归所在集体所有制组织所有。
  第三十三条 继承遗产应当清偿被继承人依法应当缴纳的税款和债务,缴纳税款和清偿债务以他的遗产实际价值为限。超过遗产实际价值部分,继承人自愿偿还的不在此限。
  继承人放弃继承的,对被继承人依法应当缴纳的税款和债务可以不负偿还责任。
  第三十四条 执行遗赠不得妨碍清偿遗赠人依法应当缴纳的税款和债务。
  第五章 附 则
  第三十五条 民族自治地方的人民代表大会可以根据本法的原则,结合当地民族财产继承的具体情况,制定变通的或者补充的规定。自治区的规定,报全国人民代表大会常务委员会备案。自治州、自治县的规定,报省或者自治区的人民代表大会常务委员会批准后生效,并报全国人民代表大会常务委员会备案。
  第三十六条 中国公民继承在中华人民共和国境外的遗产或者继承在中华人民共和国境内的外国人的遗产,动产适用被继承人住所地法律,不动产适用不动产所在地法律。
  外国人继承在中华人民共和国境内的遗产或者继承在中华人民共和国境外的中国公民的遗产,动产适用被继承人住所地法律,不动产适用不动产所在地法律。
  中华人民共和国与外国订有条约、协定的,按照条约、协定办理。
  第三十七条 本法自一九八五年十月一日起施行。
最高人民法院关于贯彻执行《中华人民共和国继承法》若干问题的意见 法[民]发[1985]22号 &
颁布日期:  实施日期:  颁布单位:最高人民法院&
  第六届全国人民代表大会第三次会议通过的《中华人民共和国继承法》,是我国公民处理继承问题的准则,是人民法院正确、及时审理继承案件的依据。人民法院贯彻执行继承法,要根据社会主义的法制原则,坚持继承权男女平等,贯彻互相扶助和权利义务相一致的精神,依法保护公民的私有财产的继承权。  为了正确贯彻执行继承法,我们根据继承法的有关规定和审判实践经验,对审理继承案件中具体适用继承法的一些问题,提出以下意见,供各级人民法院在审理继承案件时试行。一、关于总则部分  1、继承从被继承人生理死亡或被宣告死亡时开始。  失踪人被宣告死亡的,以法院判决中确定的失踪人的死亡日期,为继承开始的时间。  2、相互有继承关系的几个人在同一事件中死亡,如不能确定死亡先后时间的,推定没有继承人的人先死亡。死亡人各自都有继承人的,如几个死亡人辈份不同,推定长辈先死亡;几个死亡人辈份相同,推定同时死亡,彼此不发生继承,由他们各自的继承人分别继承。  3、公民可继承的其他合法财产包括有价证券和履行标的为财物的债权等。  4、承包人死亡时尚未取得承包收益的,可把死者生前对承包所投入的资金和所付出的劳动及其增值和孳息,由发包单位或者接续承包合同的人合理折价、补偿,其价额作为遗产。  5、被继承人生前与他人订有遗赠扶养协议,同时又立有遗嘱的,继承开始后,如果遗赠扶养协议与遗嘱没有抵触,遗产分别按协议和遗嘱处理;如果有抵触,按协议处理,与协议抵触的遗嘱全部或部分无效。  6、遗嘱继承人依遗嘱取得遗产后,仍有权依继承法第十三条的规定取得遗嘱未处分的遗产。  7、不满六周岁的儿童、精神病患者,可以认定其为无行为能力人。  已满六周岁,不满十八周岁的未成年人,应当认定其为限制行为能力人。  8、法定代理人代理被代理人行使继承权、受遗赠权,不得损害被代理人的利益。法定代理人一般不能代理被代理人放弃继承权、受遗赠权。明显损害被代理人利益的,应认定其代理行为无效。  9、在遗产继承中,继承人之间因是否丧失继承权发生纠纷,诉讼到人民法院的,由人民法院根据继承法第七条的规定,判决确认其是否丧失继承权。  10、继承人虐待被继承人情节是否严重,可以从实施虐待行为的时间、手段、后果和社会影响等方面认定。  虐待被继承人情节严重的,不论是否追究刑事责任,均可确认其丧失继承权。  11、继承人故意杀害被继承人的,不论是既遂还是未遂,均应确认其丧失继承权。  12、继承人有继承法第七条第(一)项或第(二)项所列之行为,而被继承人以遗嘱将遗产指定由该继承人继承的,可确认遗嘱无效,并按继承法第七条的规定处理。  13、继承人虐待被继承人情节严重的,或者遗弃被继承人的,如以后确有悔改表现,而且被虐待人、被遗弃人生前又表示宽恕,可不确认其丧失继承权。  14、继承人伪造、篡改或者销毁遗嘱,侵害了缺乏劳动能力又无生活来源的继承人的利益,并造成其生活困难的,应认定其行为情节严重。  15、在诉讼时效期间内,因不可抗拒的事由致继承人无法主张继承权利的,人民法院可按中止诉讼时效处理。  16、继承人在知道自己的权利受到侵犯之日起的二年之内,其遗产继承权纠纷确在人民调解委员会进行调解期间,可按中止诉讼时效处理。  17、继承人因遗产继承纠纷向人民法院提起诉讼,诉讼时效即为中断。  18、自继承开始之日起的第十八年后至第二十年期间内,继承人才知道自己的权利被侵犯的,其提起诉讼的权利,应当在继承开始之日起的二十年之内行使,超过二十年的,不得再行提起诉讼。二、关于法定继承部分  19、被收养人对养父母尽了赡养义务,同时又对生父母扶养较多的,除可依继承法第十条的规定继承养父母的遗产外,还可依继承法第十四条的规定分得生父母的适当的遗产。  20、在旧社会形成的一夫多妻家庭中,子女与生母以外的父亲的其他配偶之间形成扶养关系的,互有继承权。  21、继子女继承了继父母遗产的,不影响其继承生父母的遗产。  继父母继承了继子女遗产的,不影响其继承生子女的遗产。  22、收养他人为养孙子女,视为养父母与养子女的关系的,可互为第一顺序继承人。  23、养子女与生子女之间、养子女与养子女之间,系养兄弟姐妹,可互为第二顺序继承人。  被收养人与其亲兄弟姐妹之间的权利义务关系,因收养关系的成立而消除,不能互为第二顺序继承人。  24、继兄弟姐妹之间的继承权,因继兄弟姐妹之间的扶养关系而发生。没有扶养关系的,不能互为第二顺序继承人。  继兄弟姐妹之间相互继承了遗产的,不影响其继承亲兄弟姐妹的遗产。  25、被继承人的孙子女、外孙子女、曾孙子女、外曾孙子女都可以代位继承,代位继承人不受辈数的限制。  26、被继承人的养子女、已形成扶养关系的继子女的生子女可代位继承;被继承人亲生子女的养子女可代位继承;被继承人养子女的养子女可代位继承;与被继承人已形成扶养关系的继子女的养子女也可以代位继承。  27、代位继承人缺乏劳动能力又没有生活来源,或者对被继承人尽过主要赡养义务的,分配遗产时,可以多分。  28、继承人丧失继承权的,其晚辈直系血亲不得代位继承。如该代位继承人缺乏劳动能力又没有生活来源,或对被继承人尽赡养义务较多的,可适当分给遗产。  29、丧偶儿媳对公婆、丧偶女婿对岳父、岳母,无论其是否再婚,依继承法第十二条规定作为第一顺序继承人时,不影响其子女代位继承。  30、对被继承人生活提供了主要经济来源,或在劳务等方面给予了主要扶助的,应当认定其尽了主要赡养义务或主要扶养义务。  31、依继承法第十四条规定可以分给适当遗产的人,分给他们遗产时,按具体情况可多于或少于继承人。  32、依继承法第十四条规定可以分给适当遗产的人,在其依法取得被继承人遗产的权利受到侵犯时,本人有权以独立的诉讼主体的资格向人民法院提起诉讼。但在遗产分割时,明知而未提出请求的,一般不予受理;不知而未提出请求,在二年以内起诉的,应予受理。  33、继承人有扶养能力和扶养条件,愿意尽扶养义务,但被继承人因有固定收入和劳动能力,明确表示不要求其扶养的,分配遗产时,一般不应因此而影响其继承份额。  34、有扶养能力和扶养条件的继承人虽然与被继承人共同生活,但对需要扶养的被继承人不尽扶养义务,分配遗产时,可以少分或者不分。三、关于遗嘱继承部分  35、继承法实施前订立的,形式上稍有欠缺的遗嘱,如内容合法,又有充分证据证明确为遗嘱人真实意思表示的,可以认定遗嘱有效。  36、继承人、受遗赠人的债权人、债务人,共同经营的合伙人,也应当视为与继承人、受遗赠人有利害关系,不能作为遗嘱的见证人。  37、遗嘱人未保留缺乏劳动能力又没有生活来源的继承人的遗产份额,遗产处理时,应当为该继承人留下必要的遗产,所剩余的部分,才可参照遗嘱确定的分配原则处理。  继承人是否缺乏劳动能力又没有生活来源,应按遗嘱生效时该继承人的具体情况确定。  38、遗嘱人以遗嘱处分了属于国家、集体或他人所有的财产,遗嘱的这部分,应认定无效。  39、遗嘱人生前的行为与遗嘱的意思表示相反,而使遗嘱处分的财产在继承开始前灭失,部分灭失或所有权转移、部分转移的,遗嘱视为被撤销或部分被撤销。  40、公民在遗书中涉及死后个人财产处分的内容,确为死者真实意思的表示,有本人签名并注明了年、月、日,又无相反证据的,可按自书遗嘱对待。  41、遗嘱人立遗嘱时必须有行为能力。无行为能力人所立的遗嘱,即使其本人后来有了行为能力,仍属无效遗嘱。遗嘱人立遗嘱时有行为能力,后来丧失了行为能力,不影响遗嘱的效力。  42、遗嘱人以不同形式立有数份内容相抵触的遗嘱,其中有公证遗嘱的,以最后所立公证遗嘱为准;没有公证遗嘱的,以最后所立的遗嘱为准。  43、附义务的遗嘱继承或遗赠,如义务能够履行,而继承人、受遗赠人无正当理由不履行,经受益人或其他继承人请求,人民法院可以取消他接受附义务那部分遗产的权利,由提出请求的继承人或受益人负责按遗嘱人的意愿履行义务,接受遗产。四、关于遗产的处理部分  44、人民法院在审理继承案件时,如果知道有继承人而无法通知的,分割遗产时,要保留其应继承的遗产,并确定该遗产的保管人或保管单位。  45、应当为胎儿保留的遗产份额没有保留的应从继承人所继承的遗产中扣回。  为胎儿保留的遗产份额,如胎儿出生后死亡的,由其继承人继承;如胎儿出生时就是死体的,由被继承人的继承人继承。  46、继承人因放弃继承权,致其不能履行法定义务的,放弃继承权的行为无效。  47、继承人放弃继承应当以书面形式向其他继承人表示。用口头方式表示放弃继承,本人承认,或有其它充分证据证明的,也应当认定其有效。  48、在诉讼中,继承人向人民法院以口头方式表示放弃继承的,要制作笔录,由放弃继承的人签名。  49、继承人放弃继承的意思表示,应当在继承开始后、遗产分割前作出。遗产分割后表示放弃的不再是继承权,而是所有权。  50、遗产处理前或在诉讼进行中,继承人对放弃继承翻悔的,由人民法院根据其提出的具体理由,决定是否承认。遗产处理后,继承人对放弃继承翻悔的,不予承认。  51、放弃继承的效力,追溯到继承开始的时间。  52、继承开始后,继承人没有表示放弃继承,并于遗产分割前死亡的,其继承遗产的权利转移给他的合法继承人。  53、继承开始后,受遗赠人表示接受遗赠,并于遗产分割前死亡的,其接受遗赠的权利转移给他的继承人。  54、由国家或集体组织供给生活费用的烈属和享受社会救济的城市居民,其遗产仍应准许合法继承人继承。  55、集体组织对“五保户”实行“五保”时,双方有扶养协议的,按协议处理;没有扶养协议,死者有遗嘱继承人或法定继承人要求继承的,按遗嘱继承或法定继承处理,但集体组织有权要求扣回“五保”费用。  56、扶养人或集体组织与公民订有遗赠扶养协议,扶养人或集体组织无正当理由不履行,致协议解除的,不能享有受遗赠的权利,其支付的供养费用一般不予补偿;遗赠人无正当理由不履行,致协议解除的,则应偿还扶养人或集体组织已支付的供养费用。  57、遗产因无人继承收归国家或集体组织所有时,按继承法第十四条规定可以分给遗产的人提出取得遗产的要求,人民法院应视情况适当分给遗产。  58、人民法院在分割遗产中的房屋、生产资料和特定职业所需要的财产时,应依据有利于发挥其使用效益和继承人的实际需要,兼顾各继承人的利益进行处理。  59、人民法院对故意隐匿、侵吞或争抢遗产的继承人,可以酌情减少其应继承的遗产。  60、继承诉讼开始后,如继承人、受遗赠人中有既不愿参加诉讼,又不表示放弃实体权利的,应追加为共同原告;已明确表示放弃继承的,不再列为当事人。  61、继承人中有缺乏劳动能力又没有生活来源的人,即使遗产不足清偿债务,也应为其保留适当遗产,然后再按继承法第三十三条和民事诉讼法第一百八十条的规定清偿债务。  62、遗产已被分割而未清偿债务时,如有法定继承又有遗嘱继承和遗赠的,首先由法定继承人用其所得遗产清偿债务;不足清偿时,剩余的债务由遗嘱继承人和受遗赠人按比例用所得遗产偿还;如果只有遗嘱继承和遗赠的,由遗嘱继承人和受遗赠人按比例用所得遗产偿还。五、关于附则部分  63、涉外继承,遗产为动产的,适用被继承人住所地法律,即适用被继承人生前最后住所地国家的法律。  64、继承法施行前,人民法院已经审结的继承案件,继承法施行后,按审判监督程序提起再审的,适用审结时的有关政策、法律。  人民法院对继承法生效前已经受理、生效时尚未审结的继承案件,适用继承法。但不得再以超过诉讼时效为由驳回起诉。 &
杨景明法律服务网
All rights reserved  版权所有 杨景明法律服务网
ICP备案编号:  14035人阅读
多重继承和虚继承的内存布局
刺猬@http://blog.csdn.net/littlehedgehog
&&& 这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。原文见(By Edsko de Vries, January 2006)
&&&&& 敬告本文是介绍的技术文章,假定读者对于有比较深入的认识,同时也需要一些汇编知识。
&&&本文我们将阐释编译器针对多重继承和虚拟继承下的对象内存布局。尽管在理想的使用环境中,一个程序员并不需要了解这些编译器内部实现细节,实际上,编译器针对多重继承特别是虚拟继承的各种实现细节对于我们编写代码都或多或少产生一些影响比如、以及虚基类构造函数的调用顺序。如果你能明白多重继承是如何实现的,那么你自己就能够预见到这些影响,进而能够在你的代码中很好地应对它们。再者,如果你十分在意的代码的运行效率,正确地理解虚继承也是很有帮助的。最后嘛,这个的过程是很有趣的哦
&& 首先我们先来考虑一个很简单的多重继承。看看下面这个类层次结构。
&1 class&Top&2 {&3 public:&4 && int&a;&5 };&6 &7 class&Left : public&Top&8 {&9 public:10 && int&b;11 };12 13 class&Right : public&Top14 {15 public:16 && int&c;17 };18 19 class&Bottom : public&Left, public&Right20 {21 public:22 && int&d;23 };24 &&& 用表述如下:
&&&&注意到类实际上被继承了两次,这种机制在fel中被称作),这就意味着在一个对象中实际上有两个属性和&访问)&。
&&& 那么、、在内存中如何分布的呢?我们先来看看简单的和内存分布:
&&&&&& [Right 类的布局和Left是一样的,因此我这里就没再画图了。刺猬]
&&&&&& 注意到上面类各自的第一个属性都是继承自类,这就意味着下面两个赋值语句:
1 Left* left = new&Left();2 Top* top =
&&&&&& left和实际上是指向两个相同的地址,我们可以把对象当作一个对象同样也可以把对象当对象来使用。但是对象呢是这样处理的:
&&&& 但是现在如果我们一个指针将会有什么结果
Bottom* bottom = new&Bottom();2 Left* left =&
&&&&&& 这段代码运行正确。这是因为选择的这种内存布局使得我们可以把对象当作对象,它们两者部分正好相同。但是,如果我们把对象指针到对象呢
1 Right* right =
&&&&&&如果我们要使这段代码正常工作的话,我们需要调整指针指向中相应的部分。
&&&& 通过调整,我们可以用指针访问对象,这时对象表现得就如对象。但是和指针指向了不同的内存地址。最后,我们考虑下
1 Top* top =
&&&& 恩,什么结果也没有,这条语句实际上是有歧义的,编译器会报错: error: `Top' is an ambiguous base of `Bottom'。其实这两种带有歧义的可能性可以用如下语句加以区分:
1 Top* topL = (Left*)2 Top* topR = (Right*) &
& 这两个赋值语句执行之后,和指针将指向同一个地址,同样和也将指向同一个地址。
&& 为了避免上述类的多次继承,我们必须虚拟继承类。
&1 class Top&2 {&3 &&&&public:&4 &&&&&&&&int&a;&5 };&6 &7 class Left : virtual public Top&8 {&9 &&&&public:10 &&&&&&&&int&b;11 };12 13 class Right : virtual public Top14 {15 &&&&public:16 &&&&&&&&int&c;17 };18 19 class Bottom : public Left, public Right20 {21 &&&&public:22 &&&&&&&&int&d;23 };24&
&& 上述代码将产生如下的类层次图其实这可能正好是你最开始想要的继承方式。
&&&& 对于程序员来说,这种类层次图显得更加简单和清晰,不过对于一个编译器来说,这就复杂得多了。我们再用的内存布局作为例子考虑,它可能是这样的
这种内存布局的优势在于它的开头部分部分和的布局正好相同,我们可以很轻易地通过一个指针访问一个对象。不过,我们再来考虑考虑
1 Right* right =
& 这里我们应该把什么地址赋值给指针呢?理论上说,通过这个赋值语句,我们可以把这个指针当作真正指向一个对象的指针现在指向的是来使用。但实际上这是不现实的!一个真正的对象内存布局和对象部分是完全不同的,所以其实我们不可能再把这个的对象当作一个真正的对象来使用了。而且,我们这种布局的设计不可能还有改进的余地了。这里我们先看看实际上内存是怎么分布的,然后再解释下为什么这么设计。
&&&&& 上图有两点值得大家注意。第一点就是类中成员分布顺序是完全不一样的实际上可以说是正好相反。第二点,类中增加了指针,这些是被编译器在编译过程中插入到类中的在设计类时如果使用了虚继承,虚函数都会产生相关。同时,在类的构造函数中会对相关指针做初始化,这些也是编译器完成的工作。Vptr指针指向了一个&&。在类中每个虚基类都会存在与之对应的一个指针。为了给大家展示作用,考虑下如下代码。
1 Bottom* bottom = new Bottom();2 Left* left =3 int&p = left-&a;&&& 第二条的赋值语句让指针指向和同样的起始地址即它指向对象的&顶部&。我们来考虑下第三条的赋值语句。
1 movl&&left, %eax&&&&&&&&# %eax&= left2 movl&&(%eax), %eax&&&&&&# %eax&= left.vptr.Left3 movl&&(%eax), %eax&&&&&&# %eax&= virtual&base&offset&4 addl&&left, %eax&&&&&&&&# %eax&= left&+ virtual&base&offset5 movl&&(%eax), %eax&&&&&&# %eax&= left.a6 movl&&%eax, p&&&&&&&&&& # p&= left.a
&&&&&&&总结下,我们用指针去索引找到,然后在中获取到虚基类的偏移指针上加上这个偏移量,这样我们就获取到了类中类的开始地址。从上图中,我们可以看到对于指针,它的,如果我们假设中每个成员都是字节大小,那么指针加上字节正好是成员的地址。
Bottom* bottom = new Bottom();2 Right* right =3 int&p = right-&a;
对象中相应的位置。
&&&&& 的赋值语句最终会被编译成和上述相同的方式访问。唯一的不同是就是,我们访问的现在指向了另一个地址,我们得到的也变为。我们画图总结下:
对象也如同访问一个经过(到对象)的对象一样。这里我们也在对象中引入。
&&& OK,现在这样的设计终于让我们可以通过一个指针访问对象了。不过,需要提醒的是以上设计需要承担一个相当大的代价:我们需要引入虚函数表,对象底层也必须扩展以支持一个或多个虚函数指针,原来一个简单的成员访问现在需要通过虚函数表两次间接寻址编译器优化可以在一定程度上减轻性能损失。
会涉及到在指针上添加偏移量。可能有朋友猜想,一个指针仅仅减去一些偏移量就行了吧。实际上,非虚继承情况下确实是这样,但是,对于虚继承来说,又不得不引入其它的复杂问题。这里我们在上面的例子中添加一些继承关系:
class AnotherBottom : public Left, public Right2 {3 &&&&public:4 &&&&&&&&int&e;5 &&&&&&&&int&f;6 };
&& 这个继承关系如下图所示:
&& 那么现在考虑如下代码
1 Bottom* bottom1 = new&Bottom();2 AnotherBottom* bottom2 = new&AnotherBottom();3 Top* top1 = bottom1;4 Top* top2 = bottom2;5 Left* left = static_cast&Left*&(top1);&& 下面这图展示了和的内存布局,同时也展示了各自指针所指向的位置。
&&&&& 现在我们来考虑考虑从到的,注意这里我们并不清楚对于指针指向的对象是还是。这里是根本不能编译通过的!因为根本不能确认运行时需要调整的偏移量对于是,对于是。所以编译器将会提出错误: error: cannot convert from base `Top' to derived type `Left' via virtual base `Top'。这里我们需要知道运行时信息,所以我们需要使用
1 Left* left = dynamic_cast&Left*&(top1);
&&&&不过,编译器仍然会报错的关键问题在于使用(和使用一样)需要知道指针所指对象的运行时信息。但是,回头看看上面的结构图,我们就会发现指针所指的仅仅是一个整数成员。编译器没有在类中包含针对的,它认为这完全没有必要。为了强制编译器在中包含的,我们可以在类里面添加一个虚析构函数。
1 class&Top2 {3 &&&&public:4 &&&&&&&&virtual&~Top() {} 5 &&&&&&&&int&a;6 };
&&&&这就迫使编译器为类添加了一个。下面来看看新的内存布局:
&& 是的,其它派生类、都会添加一个,编译器为生成了一个库函数调用。
1 left = __dynamic_cast(top1, typeinfo_for_Top, typeinfo_for_Left, -1);
&& __dynamic_cast定义在对应的头文件是,有了、和的类型信息,转换得以执行。其中,参数代表的是类和类之间的关系未明。如果想详细了解,请参看的实现。
&&& 最后,我们再聊聊一些相关内容。
&&&这里的问题初看摸不着头脑,但是细细想来有些问题还是显而易见的。这里我们考虑一个问题,还是以上节的中的类继承结构图作为例子。
1 Bottom* b = new&Bottom();2 Right* r =
&&(在把指针的值赋值给指针时,指针将加上字节,这样指针才指向对象中部分。因此我们可以把类型的值赋值给对象。但是和两种类型的指针之间赋值呢?
1 Bottom** bb = &b;2 Right** rr =
&&&编译器能通过这两条语句吗?实际上编译器会报错: error: invalid conversion from `Bottom**' to `Right**'& 为什么不妨反过来想想,如果能够将赋值给,如下图所示。所以这里和两个指针都指向了,和都指向了对象的相应部分。那么现在考虑考虑如果给赋值将会发生什么。
& 注意是类型一级的指针,所以这个赋值是有效的!
&&& 这个就和我们上面给指针赋值一样是一级的类型指针,而同样是一级指针。所以,编译器将采用相同的方式实现对的赋值操作。实际上,我们又要调整的值,加上字节,然后赋值给,但是现在其实是指向的如下图
&&& 呃,如果我们通过访问对象,那么按照上图结构我们能够完成对对象的访问,但是如果是用来访问对象呢,所有的对象引用实际上都偏移了字节&&明显是错误的!
&& 总而言之,尽管和之间能依靠类继承关系相互转化,而和不能有这种推论。
虚基类的构造函数
&& 编译器必须要保证所有的虚函数指针要被正确的初始化。特别是要保证类中所有虚基类的构造函数都要被调用,而且还只能调用一次。如果你写代码时自己不显示调用构造函数,编译器会自动插入一段构造函数调用代码。这将会导致一些奇怪的结果,同样考虑下上面的类继承结构图,不过要加入构造函数。
&1 class&Top&2 {&3 public:&4 && Top() { a = -1; } &5 && Top(int&_a) { a = _a; } &6 && int&a;&7 };&8 &9 class&Left : public&Top10 {11 public:12 && Left() { b = -2; }13 && Left(int&_a, int&_b) : Top(_a) { b = _b; }14 && int&b;15 };16 17 class&Right : public&Top18 {19 public:20 && Right() { c = -3; }21 && Right(int&_a, int&_c) : Top(_a) { c = _c; }22 && int&c;23 };24 25 class&Bottom : public&Left, public&Right26 {27 public:28 && Bottom() { d = -4; } 29 && Bottom(int&_a, int&_b, int&_c, int&_d) : Left(_a, _b), Right(_a, _c) 30 &&&&{ 31 &&&&&&d = _d; 32 &&&&}33 && int&d;34 };35&&& 先来考虑下不包含虚函数的情况,下面这段代码输出什么
1 Bottom bottom(1,2,3,4);2 printf("%d&%d&%d&%d&%d/n", bottom.Left::a, bottom.Right::a, bottom.b, bottom.c, bottom.d);&& 你可能猜想会有这样结果:
1 1 2 3 4&& 但是,如果我们考虑下包含虚函数的情况呢,如果我们从虚继承派生出子类,那么我们将得到如下结果:
-1 -1 2 3 4&& 如本节开头所讲,编译器在中插入了一个的默认构造函数,而且这个默认构造函数安排在其他的构造函数之前,当开始调用它的基类构造函数时,我们发现已经构造初始化好了,所以相应的构造函数不会被调用。如果跟踪构造函数,我们将会看到
Top::Top()Left::Left(1,2)Right::Right(1,3)Bottom::Bottom(1,2,3,4)&& 为了避免这种情况,我们应该显示地调用虚基类的构造函数
1 Bottom(int&_a, int&_b, int&_c, int&_d): Top(_a), Left(_a,_b), Right(_a,_c) 2 { 3 && d = _d; 4 }
&1 dynamic_cast&void*&(b);
&&& 最后我们来考虑下把一个指针转换到。编译器会把指针调整到对象的开始地址。通过查,这个应该是很容易实现。看看上面的结构图,其中就是到对象开始地址。另外因为要查阅,所以需要使用。
指针的比较
&& 再以上面Bottom类继承关系为例讨论,下面这段代码会打印Equal吗?
1 Bottom* b = new&Bottom(); 2 Right* r =3 &&&&&&4 if(r == b)5 && printf("Equal!/n");&&&先明确下这两个指针实际上是指向不同地址的,r指针实际上在b指针所指地址上偏移8字节,但是,这些C++内部细节不能告诉C++程序员,所以C++编译器在比较r和b时,会把r减去8字节,然后再来比较,所以打印出的值是"Equal".
参考文献&&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:330628次
积分:4787
积分:4787
排名:第1893名
原创:118篇
评论:432条
(1)(1)(1)(3)(2)(3)(11)(23)(3)(4)(2)(15)(8)(13)(13)(3)(4)(5)(3)(7)}

我要回帖

更多关于 房屋继承法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信