- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HYPERLINK /chio/archive/2007/09/10/888260.html 虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
一. 虚析构函数我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。如:
class Base{public:Base(){}virtual ~Base(){}};class Derived: public Base{public:Derived(){};~Derived(){};}void foo(){Base *pb;pb = new Derived;delete pb;}
这是正确的用法,会发生动态绑定,它会先调用Derived的析构函数,然后是Base的析构函数如果析构函数不加virtual,delete pb只会执行Base的析构函数,而不是真正的Derived析构函数。因为不是virtual函数,所以调用的函数依赖于指向静态类型,即Base二. 纯虚析构函数现在的问题是,我们想把Base做出抽象类,不能直接构造对象,需要在其中定义一个纯虚函数。如果其中没有其他合适的函数,可以把析构函数定义为纯虚的,即将前面的CObject定义改成:
class Base{public:Base(){}virtual ~Base()= 0};
可是,这段代码不能通过编译,通常是link错误,不能找到~Base()的引用(gcc的错误报告)。这是因为,析构函数、构造函数和其他内部函数不一样,在调用时,编译器需要产生一个调用链。也就是,Derived的析构函数里面隐含调用了Base的析构函数。而刚才的代码中,缺少~Base()的函数体,当然会出现错误。这里面有一个误区,有人认为,virtual f()=0这种纯虚函数语法就是没有定义体的语义。其实,这是不对的。这种语法只是表明这个函数是一个纯虚函数,因此这个类变成了抽象类,不能产生对象。我们完全可以为纯虚函数指定函数体 ( HYPERLINK /~bs/bs_faq2.html \l pure-virtual /~bs/bs_faq2.html#pure-virtual)。通常的纯虚函数不需要函数体,是因为我们一般不会调用抽象类的这个函数,只会调用派生类的对应函数。这样,我们就有了一个纯虚析构函数的函数体,上面的代码需要改成:
class Base{public:Base(){}virtual ~Base() = 0; //pure virtual};Base::~Base()//function body{}
从语法角度来说,不可以将上面的析构函数直接写入类声明中(内联函数的写法)。这或许是一个不正交化的地方。但是这样做的确显得有点累赘这个问题看起来有些学术化,因为一般我们完全可以在Base中找到一个更加适合的函数,通过将其定义为没有实现体的纯虚函数,而将整个类定义为抽象类。但这种技术也有一些应用,如这个例子:
class Base //abstract class{public:virtual ~Base(){};//virtual, not purevirtual void Hiberarchy() const = 0;//pure virtual};void Base::Hiberarchy() const //pure virtual also can have function body{std::cout Base::Hiberarchy;}class Derived : public Base{public:Derived(){}virtual void Hiberarchy() const{CB::Hiberarchy();std::cout Derived::Hiberarchy;}virtual void foo(){}};int main(){Base* pb=new Derived();pb-Hiberarchy();pb-Base::Hiberarchy();return 0;}
在这个例子中,我们试图打印出类的继承关系。在根基类中定义了虚函数Hiberarchy,然后在每个派生类中都重载此函数。我们再一次看到,由于想把Base做成个抽象类,而这个类中没有其他合适的方法成员可以定义为纯虚的,我们还是只好将Hiberarchy定义为纯虚的。(当然,完全可以定义~Base函数,这就和上面的讨论一样了。^_^)另
您可能关注的文档
最近下载
- YS∕T 575.23-2021 铝土矿石化学分析方法 第23部分:元素含量的测定 X射线荧光光谱法.pdf
- 2025至2030中国燃料乙醇行业现状调查及投资前景策略分析报告.docx
- 智能网联汽车2025年智能网联汽车测试评价体系报告.docx
- 公司申购单模板.pdf VIP
- 高校电子课件:职业生涯管理(第五版).ppt
- 部编版小学语文六年级上册第八单元作业设计.docx
- 中长导管临床应用.pptx VIP
- 第二类精神药品经营企业监督检查要点.pptx
- 《教育强国建设规划纲要(2024-2035年)》全文解读PPT课件.ppt
- YBT 2206.2-1998耐火浇注料抗热震性试验方法(水急冷法).pdf
文档评论(0)