派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换

No viable conversion between Derived Class (constructor has parameters) and Base Class (constructor is absent of parameters)

本文关键字:参数 构造函数 转换 之间 派生 基类      更新时间:2023-10-16

我有一个抽象类Handle((,其中包含一个handle((方法(以及其他方法(。这个类被实现多次,每个类以不同的方式处理不同类型的数据(存储为字节(,例如

class BaseHandle
{
virtual void handle(uint8_t *ptr, uint8_t data_size) = 0;
}

class DerivedHandleA : public BaseHandle 
{
void handle(uint8_t *ptr, uint8_t data_size)
{
//DO THINGS WITH DATA OF KIND "A"
}
}

class DerivedHandleB : public BaseHandle 
{
void handle(uint8_t *ptr, uint8_t data_size)
{
//DO THINGS WITH DATA OF KIND "B"
}
}

我的问题是,在处理某些类型的数据时,handle(( 方法需要访问其他类的实例来调用它们的成员函数,我通常会通过构造函数传递这些函数,所以目前我的代码是这样的:

class DerivedHandleC : BaseHandle 
{
private:
HelperClass helper;
void handle(uint8_t *ptr, uint8_t data_size)
{
//DO THINGS WITH DATA OF KIND "C" WITH FUNCTIONS FROM helper
}
public:
DerivedHandleC(HelperClass helper) : BaseHandle() helper(helper){};
}

出现此问题是因为我有一个 std::vector,其中包含 Handler 类的每个实例,每次我获取数据以找到正确的处理程序并发送数据时,都会遍历该实例。这适用于没有参数的 DerivedHandle,但对于带有参数的构造函数,我在将其推送到我的向量时会收到一个no viable conversion from 'DerivedHandleC' to 'BaseHandle',这是可以理解的。

我的问题是,我应该做什么而不是通过构造函数传递我需要的参数?我不想简单地将相同的参数添加到所有不需要它们的派生类中,尽管我知道这将解决我的编译错误。


编辑

根据要求添加标准::矢量代码:

声明

typedef std::vector<std::unique_ptr<BaseHandler>> HandlerVec;
HandlerVec handlers;

推回法

registerHandler(std::unique_ptr<BaseHandler> handler)
{
handlers.push_back(std::move(handler));
}

反推调用示例

registerHandler(std::make_unique<DerivedHandleA>());
registerHandler(std::make_unique<DerivedHandleC>(helper));

与使用struct声明的类类型相比,使用class关键字声明的类类型默认具有私有继承。

下面是一个示例:

struct A {};
struct B : A {
// inherit publicly from A, the outside world can see the inheritance graph 
};
class C : A {
// privately inherit, the outside world cannot see the inheritance
};

若要公开继承,请使用struct或使用带有说明符的类来覆盖默认行为:

class D : public A {
// inherit publicly
};