c – 所有派生类必须实现自己的析构函数,否则报告编译错误?
发布时间:2020-12-16 06:50:19 所属栏目:百科 来源:网络整理
导读:最近面试官问我以下问题 “派生类允许从基类继承,但所有派生类必须实现用户定义的析构函数.如果派生类没有定义用户定义析构函数,则报告编译错误. “ 任何想法,如何解决这个问题? 想到在Base类中使用纯虚析构函数来解决这个问题,但它并没有解决问题. 对于下
最近面试官问我以下问题
“派生类允许从基类继承,但所有派生类必须实现用户定义的析构函数.如果派生类没有定义用户定义析构函数,则报告编译错误. “ 任何想法,如何解决这个问题? 想到在Base类中使用纯虚析构函数来解决这个问题,但它并没有解决问题. 对于下面的代码,我希望编译器报告错误,因为派生类没有实现用户定义的析构函数 class Base { public: virtual ~Base() = 0; }; Base::~Base() { cout << "Base destructor" << endl; } *//expecting an error here,since no user defined destructor* class Derived : public Base { }; int main() { Derived d; } 解决方法
有一些方法可以使用异常规范来强制执行显式声明的析构函数
class Enforcer { class InnerEnforcer { }; protected: ~Enforcer() throw(InnerEnforcer) { std::cout << "Enforcer::dtor" << std::endl; } }; class Base : public virtual Enforcer { public: virtual ~Base() throw() { std::cout << "Base::dtor" << std::endl; } }; class Derived : public Base { public: //~Derived() throw() { std::cout << "Derived:dtor" << std::endl; } }; int main() { Derived d; Base* b = new Derived(); delete b; return 0; } 此代码不会使用错误’looser throw说明符进行编译,用于虚拟Derived :: ~Derived()throw(Enforcer :: InnerEnforcer)’.取消注释该行将编译没有错误. 编辑:更改类Base:虚拟Enforcer到类Base:public virtual Enforcer (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# 动态加载dll文件,并实现调用其中的简单方法
- Swift - UITableView
- Xcode:“在项目中查找”找不到一些文字
- c# – 如何处理nameof(this)来报告类名
- 有没有人知道Swift背后的“(nil <0)== true”和“(nil <=
- PostgreSQL – “多态表”vs 3表
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- c# – connectionstring在iis中声明而不在web.config中声明
- Flash始终位于最上层的解决方法(让FLASH对象位于DIV层之下)
- ruby-on-rails – 如何使用资产管道在元素div中添加style =