Error: Object of abstract class type is not allowed

Error: Object of abstract class type is not allowed

我试图覆盖 class 中的一个函数,该函数为我的日志文件生成 header。要添加到函数生成的 header 中,我必须覆盖它并且很难这样做。感谢 Niko 在下面的输入,我在下面编辑了我的问题。我现在知道我不能从抽象 class 创建 object,所以我需要使用引用或指针。

main.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 的指针分配内存时出现此错误。 "Error: object of abstract class type "日志文件::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.)