我已经实现了一个界面:
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
是否会产生问题?
P.S。:错误的行在构造函数的定义中。
答案 0 :(得分:2)
问题是
virtual ~ISolution() = 0;
析构函数未实现。 尝试
virtual ~ISolution() { }
代替。
即使仅创建派生类的实例,也需要这样做,因为析构函数是特殊的。 在普通函数中,需要显式调用基类实现,如
void Derived::Foo() {
Base::Foo();
....
}
但是对于析构函数,这总是自动完成。
答案 1 :(得分:2)
根据C ++标准
9析构函数可以声明为虚拟(10.3)或纯虚拟(10.4); 如果在该类中创建了该类或任何派生类的任何对象 程序,应该定义析构函数。
所以你必须定义基类的析构函数,因为它是从派生类的析构函数中调用的。
答案 2 :(得分:1)
纯virtual
析构函数仍然需要基类实现。至少在这种情况下会这样做,因为如果没有它,你就不能delete
该对象。
虽然不直观,但在实现多态基类时,这是一个相当常见的范例。
在某些文件中,可能是isolutiuon.cpp
,执行:
ISolution::~ISolution()
{
}