c++ - 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
解决方案
对于值类型,您需要将对象声明为 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_ptr
or 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
。)
推荐阅读
- graphql - 使用 GitHub GraphQL 检索里程碑的所有打开的里程碑和所有问题(打开和关闭)
- python - 如何使用拥抱脸实现基本问答?
- javascript - 如何通过其他 html 元素更新“select-editable”值
- nested - Octave GNU FFT嵌套镜像?
- python - 获得数组元素的严格递增序列
- c# - 在 WebAPI DelegatingHandler 中未等待的异步任务中尝试/捕获未捕获错误
- python - pandas groupby 列并检查组是否满足多个条件
- python - 为独特的类实例 Python 制作装饰器的最佳方法
- kubernetes - 应该在什么公制编织网上发出警报?
- rust - 如何在并发请求之间共享 reqwest::Client?