首页 > 编程知识 正文

析构函数有什么用,c++构造函数和析构函数

时间:2023-05-06 20:22:15 阅读:27198 作者:4234

# includecstdioclassbase { public :至base () ) :3360printf(basen ); }; class derived : public base { public :~derived () 3360:printf(derivedn ) ); }; Base *ptr=new Derived; 删除ptr; 由于父析构函数不是虚函数,编译器只能找到父析构函数,而子类析构函数不能继续找到表。 因此,上次会议发生内存泄漏,无法释放子类的数据成员。 最重要的是,这个行为不会被编译器注意到

因此,在effective c中,在验证类是否继承后,建议您在析构函数之前添加关键字virtual

因此,可以得到以下写法。

# includecstdioclassbase { public : virtual至base () {:3360printf(basen ) }; }; class derived : public base { public :至derived () ) 3360:printf(derivedn ); }; 这样就不会出现多态内存泄漏问题。

但是! 如果父类的设计者忘记添加关键字virtual,或者由于业务需要,当前类必须通过子类实现特定功能(接口- implement ),则不会再次发生泄漏

因此,子类设计者有义务提醒父类设计者缺少关键字virtual,从而避免内存泄漏

C 11新功能的关键字override是编译器检查基类的虚函数和派生类的具有override的虚函数是否有相同的函数签名,如果不匹配则报告错误

因此,子类的设计者会在析构函数后添加关键字override,如果父类缺少关键字virtual,编译器就会发现它并报告错误

# includecstdioclassbase { public : virtual至base () {:3360printf(basen ) }; }; 类委派:公共基(公共: (委派)复盖) :3360打印(委派)n ); };

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。