错误:不允许使用抽象类类型的对象
Error: Object of abstract class type is not allowed
我正在尝试覆盖类中为我的日志文件生成标头的函数。要添加到函数生成的标头中,我必须覆盖它并且很难这样做。感谢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_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
.)
相关文章:
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ 多态模板类,模板类型对象的实例化
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- C++:初始化指向具有不同类型对象的指针数组
- 在类 C++ 中构造的模板类型对象
- 如何将颁发者名称设置为x509_req类型对象
- 将任何数据类型/对象作为参数传递以确定其大小
- 将引用类型对象的数组从C#封送到C++
- <T> 从类型对象创建类型<T1>对象的构造函数
- C++是否有现有的方法来检查对象是否是派生类型对象
- C 模板:创建与现有对象相同的类型对象
- 链接列表中的虚函数 - 多种返回类型(对象)
- 没有适当操作员()的类型对象的呼叫
- 制作垫子类型对象的数组.输出窗口显示同一帧
- 抽象类型对象的分配
- 在std::list中就地创建自定义类型对象
- 接受泛型列表类型对象的参数
- C++-将模板类型对象强制转换为特定的数据类型
- 试图在C++中打印存储在类型对象数组中的信息