收藏 分销(赏)

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

上传人:a199****6536 文档编号:6577141 上传时间:2024-12-14 格式:DOCX 页数:4 大小:12.94KB 下载积分:5 金币
下载 相关 举报
C++辅导:C++函数虚函数功能失效?.docx_第1页
第1页 / 共4页
C++辅导:C++函数虚函数功能失效?.docx_第2页
第2页 / 共4页


点击查看更多>>
资源描述
C++辅导:C++函数虚函数功能失效? 先看看一个例子,基类Shape的默认构造函数不安排name空间,但子类Line的默认构造函数会根据规章自动产生name,这里我们假设name是private的,假如name不是private,问题会很简洁,也不会消失下述问题了。但在现实中,通常在基类的构造函数会初使化一些重要的private成员,或者构造函数比拟长,在子类中不想复制这些代码而盼望直接调用到基类的构造函数。一般我们可以在初使化式中直接构造基类,但有的时候,需要先计算出基类构造函数的参数,犹如本例中一样需要先产生一个autoName。   class Shape{   public:   Shape(LPCTSTR name){   this->name = new TCHAR[lstrlen(name) + 1];   lstrcpy(this->name, name);   }   Shape(){   name = NULL;   }   virtual void draw() = 0;   LPCTSTR getName() const{ return name;};   private:   LPTSTR name;   };   class Line:public Shape{   public:   static int autoIdx;   Line(){   LPTSTR autoName = new TCHAR[32];   memset(autoName, 0, 32 * sizeof(TCHAR));   lstrcpy(autoName, L“NewLine“);   _itow_s(autoIdx++, autoName + lstrlen(autoName), 8, 10);   this->Shape::Shape(autoName);   }   Line(LPCTSTR name):Shape(name){   }   void draw(){   }   };   int Line::autoIdx = 1;   int _tmain(int argc, _TCHAR* argv[])   {   Shape* l = new Line();   l->draw();   }   运行该程序,按理来说应当是没有什么问题,但实际消失的错误还是让人丈二摸不着头脑。  一开头我始终以为是不是draw()方法与基类的名称不全都,反复的拷贝,比拟参数与返回值,但始终弹出上面的错误。由于明明在Line类定义了draw()方法,怎么会调用得到Shape的纯虚函数呢?折腾了近两个小时,没辙了,只好解释代码一行一行地排查,最终发觉,当将   this->Shape::Shape(autoName);   Examda提示: 注掉之后,这个问题便不存在了。看来问题就始终出在上面的这行代码上去了,认真想想,想起虚函数表就是在构造函数中初使化的,之所以始终调用基类的方法,肯定就是在调用上面基类的构造函数时,之前已经初使化好的虚函数指针被基类的虚函数指针掩盖了。   其实之所以做上面的调用,还是受到Java语言的影响,在Java中,无论在什么位置,直接用super()就搞定了。在C++中,虚函数成员这样调用没有问题,但在构造函数中,还是会消失比拟严峻的运行故障,假如要在C++编码中不要再消失类似的问题,还是需要透彻了解在C++的构造函数究竟干了些什么,以及虚函数表,这个隐蔽在背后的实现虚函数功能的机制。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服