C++辅导:C++函数虚函数功能失效?.docxVIP

C++辅导:C++函数虚函数功能失效?.docx

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

C++辅导:C++函数虚函数功能失效?

先看看一个例子,基类Shape的默认构造函数不安排name空间,但子类Line的默认构造函数会根据规章自动产生name,这里我们假设name是private的,假如name不是private,问题会很简洁,也不会消失下述问题了。但在现实中,通常在基类的构造函数会初使化一些重要的private成员,或者构造函数比拟长,在子类中不想复制这些代码而盼望直接调用到基类的构造函数。一般我们可以在初使化式中直接构造基类,但有的时候,需要先计算出基类构造函数的参数,犹如本例中一样需要先产生一个autoName。

classShape{

public:

Shape(LPCTSTRname){

this-name=newTCHAR[lstrlen(name)+1];

lstrcpy(this-name,name);

}

Shape(){

name=NULL;

}

virtualvoiddraw()=0;

LPCTSTRgetName()const{returnname;};

private:

LPTSTRname;

};

classLine:publicShape{

public:

staticintautoIdx;

Line(){

LPTSTRautoName=newTCHAR[32];

memset(autoName,0,32*sizeof(TCHAR));

lstrcpy(autoName,L“NewLine“);

_itow_s(autoIdx++,autoName+lstrlen(autoName),8,10);

this-Shape::Shape(autoName);

}

Line(LPCTSTRname):Shape(name){

}

voiddraw(){

}

};

intLine::autoIdx=1;

int_tmain(intargc,_TCHAR*argv[])

{

Shape*l=newLine();

l-draw();

}

运行该程序,按理来说应当是没有什么问题,但实际消失的错误还是让人丈二摸不着头脑。

一开头我始终以为是不是draw()方法与基类的名称不全都,反复的拷贝,比拟参数与返回值,但始终弹出上面的错误。由于明明在Line类定义了draw()方法,怎么会调用得到Shape的纯虚函数呢?折腾了近两个小时,没辙了,只好解释代码一行一行地排查,最终发觉,当将

this-Shape::Shape(autoName);

Examda提示:注掉之后,这个问题便不存在了。看来问题就始终出在上面的这行代码上去了,认真想想,想起虚函数表就是在构造函数中初使化的,之所以始终调用基类的方法,肯定就是在调用上面基类的构造函数时,之前已经初使化好的虚函数指针被基类的虚函数指针掩盖了。

其实之所以做上面的调用,还是受到Java语言的影响,在Java中,无论在什么位置,直接用super()就搞定了。在C++中,虚函数成员这样调用没有问题,但在构造函数中,还是会消失比拟严峻的运行故障,假如要在C++编码中不要再消失类似的问题,还是需要透彻了解在C++的构造函数究竟干了些什么,以及虚函数表,这个隐蔽在背后的实现虚函数功能的机制。

文档评论(0)

可爱的家人6536 + 关注
实名认证
文档贡献者

可爱的家人

1亿VIP精品文档

相关文档