错误:不允许使用抽象类类型的对象

Error: Object of abstract class type is not allowed

本文关键字:类型 对象 抽象类 不允许 错误      更新时间:2023-10-16

我正在尝试覆盖类中为我的日志文件生成标头的函数。要添加到函数生成的标头中,我必须覆盖它并且很难这样做。感谢Niko在下面的输入,我在下面编辑了我的问题。我现在知道我无法从抽象类创建对象,所以我需要使用引用或指针。

主.cpp

#include "log_headerbase.h"
#include "log_header.h"
main()
{
logfile::headerBase *Obj = new logfile::header;
Obj.log_header() >> "Add this text to my log file";
...
}

当我尝试将内存分配给指向我的 Obj 的指针时,我收到此错误。 "错误:不允许抽象类类型为"logfile::header"的对象。

log_header.h

#ifndef log_header_h
#define log_header_h
#include "log_headerbase.h"
namespace logfile
{
class headerDerived : public headerBase
{
};
}
#endif

log_headerbase.h

#ifndef log_headerbase_h
#define log_headerbase_h
namespace logfile
{
class headerBase
{
virtual void log_header() = 0;
}
};
#endif

对于值类型,您需要将对象声明为类型headerDerived

logfile::headerDerived Obj;
Obj.log_header() >> "Add this text to my log file";

使用指针,您需要分配实际对象。在你的代码中,你只有一个单位化的指针:

logfile::headerBase *Obj;

Obj指向某个随机内存位置。你需要让它指向一些实际对象。该对象可以是headerDerived

logfile::headerBase *Obj = new headerDerived;

但是,不建议像这样手动分配内存,因为这样当您不再需要该对象时,您还需要再次手动删除该对象:

delete Obj;

如果你做得不好,你会泄漏对象(C++中没有垃圾回收器。因此,您应该使用值类型或智能指针(如shared_ptrunique_ptr):

#include <memory>
// ...
std::shared_ptr<logfile::headerBase> Obj = std::make_shared<logfile::headerDerived>();
Obj->log_header();

在任何情况下,您都应该只使用值类型,而不是指针,除非您确实有理由不这样做。如果通过引用或指针传递对象,则多态性仍然适用于值类型。这工作正常,例如:

void by_reference(logfile::headerBase& obj)
{
obj.log_header() >> "Add this text to my log file";
}
void by_pointer(logfile::headerBase* obj)
{
obj->log_header() >> "Add this text to my log file";
}

// ...
logfile::headerDerived Obj;
by_reference(Obj);
by_pointer(&Obj);

如果您希望创建的对象比创建它们时的范围更久,则可以使用智能指针而不是值类型。例如,如果将对象传递给函数,并且该函数需要存储指向该对象的指针以供以后使用,则不得使用值类型。您需要在堆上分配对象,为此,您可以使用像shared_ptr这样的智能指针(如果对象只有一个所有者,则unique_ptr,但如果不确定,请使用shared_ptr.)