首页 > 解决方案 > Error: Object of abstract class type is not allowed

问题描述

I am trying to override a function in a class that generates a header for my log file. To add to the header that the function generates I have to override it and am having difficulty doing so. Thanks to Niko's input below I edited my question below. I know now I cannot create an object from an abstract class, so I need to use a reference or pointer.

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";
...
}

I get this error when I try to allocate memory to my pointer to my Obj. "Error: object of abstract class type "logfile::header" is not allowed."

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

标签: c++overridingabstract-classvirtual-functions

解决方案


对于值类型,您需要将对象声明为 type 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_ptror unique_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。)


推荐阅读