最近面试官问了我以下问题
"派生类允许从基类继承,但所有派生类都必须实现用户自定义析构函数。 如果派生类没有定义自定义析构函数,则报告编译错误

任何想法,如何解决这个问题?

想过在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;
}

此代码将不会编译,并出现错误“虚拟 Derived::~Derived() throw(Enforcer::InnerEnforcer)”的更宽松的抛出说明符。取消注释该行将编译没有错误。

编辑:将 class Base : virtual Enforcer 更改为 class Base : public virtual Enforcer

关于c++ - 所有派生类都必须实现自己的析构函数,否则会报编译错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33228882/

10-13 04:39