加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读