使用纯抽象析构函数从 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++?。)
如果父 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++?。)