C++ 抽象类和虚拟方法问题:“;无法分配抽象类型的对象";
我有以下课程:C++ 抽象类和虚拟方法问题:“;无法分配抽象类型的对象";,c++,abstract-class,abstract,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 compa
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.
};
我对此有一些疑问:
这个错误的原因是什么?
DescHistogram::compare
的参数必须是什么类型?我知道它可以是派生类型,不是吗?
抽象类需要构造函数IDescriptor
也许这是一个愚蠢的错误,但我没有找到任何解决方案。提前感谢您的帮助 您需要在DescHistogram中定义compare函数基于您在此处编写的内容,您可以为
DescHistogram
定义compare
的实现(并且不将其标记为纯虚拟)
这个错误的原因是什么
DescHistogram
不会用兼容函数重写IDescriptor::compare
,因此它仍然是抽象的,无法实例化
DescHistogram::compare
的参数必须是什么类型
IDescriptor
,以匹配其覆盖的功能。它必须可以被基类函数接受的任何类型调用,因此不能是更派生的类型
我知道它可以是派生类型,不是吗
不,必须是同一类型
抽象类需要构造函数IDescriptor
不需要。它已经有一个隐式默认构造函数,并且不需要其他任何东西作为非抽象派生类的一部分进行实例化。您没有在DescHistogram
中实现virtual compare()
函数。您实现了另一个compare()
函数:
virtual float compare(IDescriptor *D) = 0; // in class IDescriptor
float compare(DescHistogram *D); // in class DescHistogram
另一个compare()
函数没有实现基本的virtual
函数,因此DescHistogram
仍然是抽象的
如果对从IDescriptor
派生的不同类型(例如DescHistogram
)进行比较没有意义,那么您的代码设计就是有缺陷的。您仍然可以使用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));
}
};
类描述直方图:公共IDescriptor
{
float compare_self(DescHistogram*D);//允许nullptr输入
公众:
浮点比较(IDescriptor*D)
{
返回compare_self(dynamic_cast(D));
}
};
但这可能是低效的。此外,compare\u self
没有合理的独立用途(由于设计缺陷)。已经定义并实现了比较功能(在cpp文件中)。我不明白你在说什么。抱歉:p压缩功能在我的cpp文件中实现。也许我应该在我的问题中指定它。@froure如果你在某个地方的.cpp文件中有一个实现,我建议将它添加到问题中。某些原因导致编译器找不到该实现OK,我现在了解到DescHistogram中的compare函数必须有一个IDescriptor作为参数。但是,现在,在我的DescHistogram实现中,我必须使用vector desc。在这种情况下,编译器不接受这一点,因为desc不是IDescriptor的一部分。我必须做什么?@froure:Dynamic将IDescriptor*
转换为比较方法中的DescHistogram*
。好的,它可以工作了!非常感谢你!!!我学到了更多关于抽象的东西!Thaaanks!:D
virtual float compare(IDescriptor *D) = 0; // in class IDescriptor
float compare(DescHistogram *D); // in class DescHistogram
class DescHistogram : public IDescriptor
{
float compare_self(DescHistogram *D); // tolerates nullptr input
public:
float compare(IDescriptor *D)
{
return compare_self(dynamic_cast<DescHistogram*>(D));
}
};