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,这是我自己犯的愚蠢错误,我自己也犯了这个错误!