- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
继承模板类,构造函数
篇一:C++中虚继承类构造函数的正确写法
C++中虚继承类构造函数的正确写法
时间:2015-08-26 21:57:52阅读:15评论:0收藏:0[点我收藏+]
标签:classstylelogcomhttp代码s(转载于:www.XltkWJ.Com 小 龙文档 网:继承模板类,构造函数)isrcit
最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化。这个问题与C++存在虚继承的情况下派生类构造函数的写法有关。在此说明一下错误发生的原因,希望对更多的人有帮助。
我们代码中存在虚继承的类的继承结构与下图类似,并不是教科书中经典的菱形结构。从 Intermediate1 和 Intermediate3 到Base2 的继承都是虚继承。Base1 和 Base2 都包含一些成员变量,并提供了相应的构造函数接受指定的初始化值。Base2 还有一个缺省构造函数,把其成员变量都初始化为0。Intermediate1,2,3 也都提供了一个构造函数接受指定的初始化值,并在在初始化列表里调用Base1和Base2的构造函数完成初始化。
一位同事在做重构时,不小心把Final的代码改成了: class Final : public Intermediate2, public Intermediate3 { public:
Final (int a, int b, int c)
: Intermediate2(a, b, c),
Intermediate3(b, c)
{
}
}; class Intermediate1 : public Base1, virtual public Base2 { public:
Intermediate1(int a, int b, int c)
: Base1(a),
Base2(b, c)
{
}
}; class Intermediate2 : public Intermediate1 { public:
Intermediate2(int a, int b, int c)
: Intermediate1(a, b, c),
Base2(b, c)
{
}
};
class Intermediate3 : virtual public Base2 { public:
Intermediate3(int b, int c)
: Base2(b, c)
{
}
};
看上去,Final的构造函数将调用Intermediate2 和 Intermediate3的构造函数分别将m_a, m_b 和 m_c初始化成指定的值。可是,运行时发现m_b和m_c的值是0!明显,这是调用了Base2的缺省构造函数。 原来,C++的规则是:如果在继承链上存在虚继承的基类,则最底层的子类要负责完成该虚基类部分成员的构造。我们可以显式调用虚基类的构造函数完成初始化。如果不显式调用虚基类的构造函数,则编译器会调用虚基类的缺省构造函数。如果不显式调用虚基类的构造函数,而虚基类没有定义缺省构造函数,则会出现编译错误。
很多时候,对于继承链上的中间类,我们也会在其构造函数中显式调用虚基类的构造函数,因为一旦有人要创建这些中间类的对象,我们也要保证它们得到正确的初始化。
所以,如果我们要把m_b和m_c初始化成指定的值,Final的构造函数的正确写法应该是这样:
Final (int a, int b, int c)
: Base2(b, c),
Intermediate2(a, b, c),
Intermediate3(b, c)
{
}
完整的测试程序如下所示,有兴趣的同学可以自行编译运行一下。也可以在调试器中单步运行Final的构造函数,看看前后两种写法分别是调用了Base2的哪个构造函数。 #include stdafx.h
#include lt;iostream
using namespace std; class Base1 { public:
Base1(int a): m_a(a) {}
protected:
篇二:继承与派生:派生类的构造函数
C++编程入门系列之三十九(继承与派生:派生类的构造函数)
鸡啄米前面说过,基类的构造函数和析构函数派生类是不能继承的。如果派生类需要对新成员初始化或者进行特定的清理工作,就需要自己定义构造函数和析构函数了。从基类继承的成员的初始化仍可通过基类的构造函数来完成。
我们使用派生类的对象以前需要对它的数据成员进行初始化赋值。派生类的数据成员包括从基类继承来的数据成员和派生类新增的数据成员,还可能包括其他类的对象作为其数据成员,包
您可能关注的文档
- 第三方合作协议范本.doc
- 第三方担保,协议.doc
- 第三方物流公司调查问卷.doc
- 第三次经济普查个体经营户经营情况调查表.doc
- 第二次土地调查分类表.doc
- 第二次全国土地调查成果mapgis.doc
- 第二次党校培训心得体会.doc
- 第二部分中国地理第一篇疆域和行政区划第二篇人口和民族答案.doc
- 第八届全国高中英语课堂教学观摩研讨会.doc
- 第五次全国营养调查报告.doc
- 辽宁省营口市2022-2023学年高三上学期期末教学质量监测数学试题答案.pdf
- 辽宁省名校联盟2022-2023学年高三11月联考语文试题(含答案解析).pdf
- 避孕药具不良反应监测报告制度(5篇范文) .pdf
- 资产抵债协议书范本(精选17篇) .pdf
- 辽宁省沈阳市苏家屯区2022-2023学年八年级下学期语文期中试卷.pdf
- 风险代理合同11篇 .pdf
- 辽宁省铁岭市铁岭县2023-2024学年八年级下学期期中语文试题(含答案).pdf
- 麻醉科个人年度工作总结麻醉科个人工作总结和工作计划(4篇).pdf
- 超声类医疗设备项目投资建设可行性研究报告参考范本模板 .pdf
- 赠与合同公证细则4篇 .pdf
文档评论(0)