抽象类和虚方法问题:"不能分配抽象类型的对象"

时间:2015-01-22 17:41:50

标签: c++ abstract-class abstract

我有这个课程:

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需要构造函数吗?

也许这是一个愚蠢的错误,但我没有为我的案子找到任何解决方案。在此先感谢您的帮助!

4 个答案:

答案 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)。