如果父类具有纯虚拟析构函数,我该如何正确继承它?我有一个头文件(由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
?
答案 0 :(得分:6)
您必须定义析构函数,即使它是纯虚拟(唯一)。
添加
MyClass::~MyClass() {}
只有一个.CPP文件。
(例如,参见“纯虚拟析构函数”下的http://en.cppreference.com/w/cpp/language/destructor。Why 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