使用纯抽象析构函数从 class 继承

Inheritance from class with pure abstract destructor

如果父 class 有一个纯虚拟析构函数,我如何正确地继承它?我有一个头文件(由 IBM Rational Rose 生成),如下所示:

class MyClass{
protected:
  inline MyClass() {};
  MyClass(const MyClass&);
  MyClass& operator=(const MyClass&);
public:
  inline virtual ~MyClass() = 0;
  virtual void someMethod() = 0;
};

现在我想实现这个纯抽象 class - 即

class MyClassImpl : public MyClass {
public:
  MyClassImpl(){}
  virtual void someMethod() {}
};

int main(int argc, char*argv[]) {
  MyClassImpl impl;
  return 0;
}

但无论我尝试什么(即在 MyClassImpl 中定义一个析构函数;virtual/non-virtual),我总是收到错误消息:error LNK2019: unresolved external symbol "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@UAE@XZ) referenced in function "public: virtual __thiscall MyClassImpl::~MyClassImpl(void)" (??1MyClassImpl@@UAE@XZ).

有没有什么方法可以在不更改 MyClass 的情况下实现 MyClassImpl

而是像这样声明您的 virtual 析构函数,其主体为:

inline virtual ~MyClass() {};
inline virtual ~MyClass() = default; // C++11

它必须被实现(不仅仅是声明),否则,将无法析构 MyClass 及其派生的 类(您的声明禁用了默认生成的析构函数,但没有提供替代实施)。

注意 virtual 成员函数仍然可以有一个实现,所以你可以有:

inline virtual ~MyClass() = 0;

virtual MyClass::~MyClass() {}; // defined in .h file because of inline

C++ 编译器在编译期间添加了一些隐式自动生成的代码。

class MyClassImpl : public MyClass {
public:
  MyClassImpl(){}
  virtual void someMethod() {}

  // Begin autogenerated code
  virtual ~MyClassImpl() {
    MyClass::~MyClass(); // <- This will break because your parent class
                         // lacks any destructor body and linker will             
                         // report the missing symbol.
  }
  // End autogenerated code

};

幸运的是,您可以在任何 cpp 文件中定义析构函数主体,而无需触及 Rational Rose 生成的文件。例如,您可以在 main() 函数附近添加此行。

MyClass::~MyClass(){} // Empty destructor

您必须定义析构函数,即使它是纯虚拟的(唯一的)。

添加

MyClass::~MyClass() {}

正好在一个 .CPP 文件中。

(参见示例 http://en.cppreference.com/w/cpp/language/destructor under "Pure virtual destructors". Also Why do we need a pure virtual destructor in C++?。)