从具有纯虚析构函数的类继承

3
如果一个父类有一个纯虚析构函数,我该如何正确地继承它?我有一个头文件(由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)。是否有任何方法可以在不改变MyClass的情况下实现MyClassImpl?

你使用的编译器是什么?看起来像是MSVC,但只是确认一下。 - Darko Miletic
你不能销毁一个没有析构函数的类的实例。你只能动态地创建一个并且让它泄漏。 - Kerrek SB
由于无法解析'MyClass::~MyClass( void )',请在头文件或像@MinorThreat发布的单独文件中定义该方法。 - user5496198
3个回答

6

使用普通成员函数可以实现这个吗? - Captain Giraffe
1
@CaptainGiraffe 是的。您可以定义任何纯虚函数,但只能通过非虚拟调用来调用它,例如 base::foo() - Alan Stokes

2
最好像这样声明你的虚析构函数,并带有一个函数体:

virtual析构函数的声明:

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

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

请注意,虚成员函数仍然可以有实现,因此您可以使用:

inline virtual ~MyClass() = 0;

并且

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

1
= 0; 在 OP 的代码中,强制派生类重写析构函数。这可能是有意为之的(否则没有其他原因)。你的第一个建议改变了行为。(另外,在你的前两行中,“inline”是多余的,提供内联体意味着“inline”) - M.M

2

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

这可能解释了问题,但它并没有提供任何解决方案。 - Bryan Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接