使用虚析构函数时的错误
C++ Error when using virtual destructor
我实现了一个接口:
class ISolution
{
public:
virtual ~ISolution() = 0;
virtual void resultat() = 0;
};
和一些从它派生的类:
class SolX : ISolution
{
private:
int member;
MyClass myOb;
public:
SolX(const MyClass& inOb) : myOb(inOb) {}
~SolX() {}
void resultat()
{
// the body
}
};
当我编译它时,我得到如下错误:
/proj/CSolution1.cpp:4: undefined reference to `ISolution::~ISolution()'
/proj/CSolution2.cpp:4: undefined reference to `ISolution::~ISolution()'
CMakeFiles/proj.dir/CSolution2.cpp.o:/proj/CSolution2.cpp:12: more undefined references to `ISolution::~ISolution()' follow
我正在使用CMake和Linux Ubuntu。
我不知道是什么问题。我错过了什么吗?是myOb
造成了这些问题吗?注::错误所在行在构造函数的定义处
问题是
virtual ~ISolution() = 0;
析构函数未实现。试着
virtual ~ISolution() { }
。
即使只创建派生类的实例也需要这样做,因为析构函数是特殊的。在普通函数中,需要显式调用基类实现,如
void Derived::Foo() {
Base::Foo();
....
}
但是对于析构函数,这总是自动完成的
根据c++标准
析构函数可以声明为虚函数(10.3)或纯虚函数(10.4);类的任何对象或任何派生类在程序中,必须定义析构函数。
所以必须定义基类的析构函数,因为它是从派生类的析构函数调用的。
纯virtual
析构函数仍然需要基类实现。至少在这种情况下是这样的,因为没有它你就不能delete
对象。
虽然不直观,但在实现多态基类时,这是一个相当常见的范例。
在某些文件中,可能是isolutiuon.cpp
,实现:
ISolution::~ISolution()
{
}
相关文章:
- 不命名构造函数和析构函数上的类型错误
- 导致 Seg 错误的 SingleLinkedList 的析构函数
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 矢量擦除调用的错误析构函数
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 导致堆缓冲区错误的动态分配数组的析构函数
- 非默认析构函数会导致不完整的类型错误
- 析构函数删除错误的元素
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- 使用 boost::thread 运行函子,但析构函数被错误地调用
- 错误 c++ 在令牌之前'('预期的构造函数、析构函数或类型转换
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 模板类中的析构函数给出错误
- 在析构函数内取消引用指针时出现分段错误
- 模板化子类析构函数中的隔离错误
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 获取错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- 显式调用类的析构函数时出现错误
- C++析构函数调用了错误的对象