最近面试官问我以下问题“派生类允许从基类继承,但所有派生类必须实现用户定义的析构函数。如果派生类没有定义用户定义析构函数,报告编译错误。”任何想法,如何解决这个问题?
想到在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)'。取消注释该行将编译没有错误。
编辑:将class Base : virtual Enforcer
改为class Base : public virtual Enforcer