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

C++ 派生类(构造函数有参数)和基类(构造函数没有参数)之间没有可行的转换,c++,constructor,interface,virtual,C++,Constructor,Interface,Virtual,我有一个抽象类句柄,其中包含一个句柄方法。这个类被实现了好几次,每个类以不同的方式处理以字节形式存储的不同类型的数据,例如 class BaseHandle { virtual void handle(uint8_t *ptr, uint8_t data_size) = 0; } 及 我的问题是,在处理某些类型的数据时,handle方法需要访问其他类的实例来调用其成员函数,我通常会通过构造函数传递这些函数,因此目前我的代码如下: class DerivedHandleC : BaseHa

我有一个抽象类句柄,其中包含一个句柄方法。这个类被实现了好几次,每个类以不同的方式处理以字节形式存储的不同类型的数据,例如

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

我的问题是,在处理某些类型的数据时,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,每次我获取数据时都会遍历它,以找到正确的处理程序并发送数据。对于没有参数的DerivedHandle,这很好,但是对于带有参数的构造函数,当将其推送到向量时,我没有收到从“DerivedHandleC”到“BaseHandle”的可行转换,这是可以理解的

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

编辑 根据请求添加std::矢量代码:

声明

   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
};
要公开继承,请使用结构或带有说明符的类来重写默认行为:

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

与使用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
};
要公开继承,请使用结构或带有说明符的类来重写默认行为:

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

请显示一个,听起来像你需要阅读思考你能添加代码推回到向量,包括向量的声明吗?你可能想要std::vector。出于这些原因,请查看上面的行号副本。感谢您的快速回复!我会仔细看看你的建议!请显示一个,听起来像你需要阅读思考你能添加代码推回到向量,包括向量的声明吗?你可能想要std::vector。出于这些原因,请查看上面的行号副本。感谢您的快速回复!我会仔细看看你的建议!谢谢,因为指定公共覆盖解决了我的问题!使用我的示例类,我声明了DerivedHandleA和DerivedHandleB是公共的,但没有声明DerivedHandleC,这是我自己犯的愚蠢错误,我自己也犯了这个错误!谢谢,因为指定公共覆盖解决了我的问题!使用我的示例类,我声明了DerivedHandleA和DerivedHandleB是公共的,但没有声明DerivedHandleC,这是我自己犯的愚蠢错误,我自己也犯了这个错误!