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

时间:2015-11-26 22:26:08

标签: c++ inheritance abstract-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 MyClassImpl : public MyClass {
public:
  MyClassImpl(){}
  virtual void someMethod() {}
};

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

但无论我尝试什么(即在MyClassImpl中定义析构函数;虚拟/非虚拟),我都会收到错误消息: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)

有没有办法在不更改MyClassImpl的情况下实施MyClass

3 个答案:

答案 0 :(得分:6)

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

添加

MyClass::~MyClass() {}

只有一个.CPP文件。

(例如,参见“纯虚拟析构函数”下的http://en.cppreference.com/w/cpp/language/destructorWhy do we need a pure virtual destructor in C++?。)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

使用正文声明这样的virtual析构函数:

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

必须实现(不仅仅是声明),否则,将无法破坏MyClass及其派生类(您的声明禁用默认生成的析构函数,但不提供替代实现)。< / p>

请注意,virtual成员函数仍然可以具有实现,因此您可以拥有:

inline virtual ~MyClass() = 0;

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