Derived Class(构造函数有参数)和 Base Class(构造函数没有参数)之间没有可行的转换

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

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

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() 方法需要访问其他 classes 的实例来调用它们的成员函数,我通常会通过构造函数传递这些函数,所以目前我的代码是这样的:

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 包含处理程序 class 的每个实例,每次我获取数据时都会迭代它以找到正确的处理程序并发送数据。这适用于不带参数的 DerivedHandle,但使用带参数的构造函数时,我在将其推送到我的向量时收到 no viable conversion from 'DerivedHandleC' to 'BaseHandle',这是可以理解的。

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


编辑

根据要求添加 std::vector 代码:

声明

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

后推法

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

回传调用示例[​​=19=]

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

Class 使用 class 关键字声明的类型默认具有私有继承,相比之下使用 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 或使用带有说明符的 classes 来覆盖默认行为:

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