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_ptr
或 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
.)
我试图覆盖 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_ptr
或 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
.)