我有这个课程:
class IDescriptor
{
public:
virtual float compare(IDescriptor *D) = 0;
};
class DescHistogram : public IDescriptor
{
public:
vector<float> desc;
DescHistogram(vector<float> vd);
~DescHistogram();
float compare(DescHistogram *D);
// ALL THESE FUNCTIONS ARE IMPLEMENTED IN THE SOURCE CPP FILE.
};
在我的代码的某个地方,我做了这个初始化:
vector<float> hist;
[...] // filling the vector.
DescHistogram *myDesc = new DescHistogram(hist);
point.setDescriptor(myDesc);
编译器给出了以下错误:
error: cannot allocate an object of abstract type ‘DescHistogram’
note: because the following virtual functions are pure within ‘DescHistogram’:
note: virtual float IDescriptor::compare(IDescriptor*)
我对此有一些疑问:
出现此错误的原因是什么?
什么类型必须是DescHistogram::compare
的参数?我知道它可以是衍生类型,不是吗?
抽象类IDescriptor
需要构造函数吗?
也许这是一个愚蠢的错误,但我没有为我的案子找到任何解决方案。在此先感谢您的帮助!
答案 0 :(得分:5)
出现此错误的原因是什么?
DescHistogram
不会使用兼容的功能覆盖IDescriptor::compare
,因此它仍然是抽象的,无法实例化。
DescHistogram::compare
的参数必须是什么类型?
IDescriptor
,以匹配它覆盖的功能。它必须可以使用基类函数接受的任何类型进行调用,因此不能是更加派生的类型。
我知道它可以是派生类型,不是吗?
没有。它必须是同一类型。
抽象类
IDescriptor
需要构造函数吗?
没有。它已经有一个隐式的默认构造函数,并且不需要将任何其他东西作为非抽象派生类的一部分进行实例化。
答案 1 :(得分:3)
您未在virtual compare()
中实施DescHistogram
功能。您实现了另一个compare()
函数:
virtual float compare(IDescriptor *D) = 0; // in class IDescriptor
float compare(DescHistogram *D); // in class DescHistogram
这个其他compare()
函数没有实现基类的virtual
函数,因此DescHistogram
仍然是抽象的。
如果从DescHistogram
派生的不同类型(例如IDescriptor
)之间进行比较没有意义,那么您的代码设计就存在缺陷。您仍然可以使用RTTI使代码正常工作,即通过
class DescHistogram : public IDescriptor
{
float compare_self(DescHistogram *D); // tolerates nullptr input
public:
float compare(IDescriptor *D)
{
return compare_self(dynamic_cast<DescHistogram*>(D));
}
};
但这可能效率低下。此外,compare_self
没有任何合理的独立目的(由于设计缺陷)。
答案 2 :(得分:0)
您需要在DescHistogram中定义比较功能
答案 3 :(得分:0)
根据您在此处撰写的内容,您可以为compare
定义DescHistogram
的实施(并且也不会将其标记为纯virtual
)。