C++ 非虚拟基的多态成员类
首先,如果我找到的所有多态性答案都是“如果基函数不是虚函数,并且派生对象存储在base类型的指针中,那么就不能调用派生函数”。但是当你想做的时候,他们从来不会告诉你该做什么。这就是我需要做的 我有一个我无法控制的基类C++ 非虚拟基的多态成员类,c++,arduino,polymorphism,type-erasure,dynamic-dispatch,C++,Arduino,Polymorphism,Type Erasure,Dynamic Dispatch,首先,如果我找到的所有多态性答案都是“如果基函数不是虚函数,并且派生对象存储在base类型的指针中,那么就不能调用派生函数”。但是当你想做的时候,他们从来不会告诉你该做什么。这就是我需要做的 我有一个我无法控制的基类B。它是开源的(TwoWire来自Arduino库),如果我进行本地修改,它将不适用于其他人 我有一个派生类D和一个用户类U,这两个类我都可以控制 实际上,我希望用户透明地使用我的类U,使用B或D作为参数,将其存储在成员中,并在成员函数中使用 我在学习虚拟之前的徒劳尝试需要在基类上进
B
。它是开源的(TwoWire
来自Arduino库),如果我进行本地修改,它将不适用于其他人
我有一个派生类D
和一个用户类U
,这两个类我都可以控制
实际上,我希望用户透明地使用我的类U
,使用B
或D
作为参数,将其存储在成员中,并在成员函数中使用
我在学习虚拟之前的徒劳尝试需要在基类上进行:
#包括
使用名称空间std;
B类{
公众:
void foo(){cout由于无法使成员函数虚拟化
,因此必须使用类型擦除模拟动态调度:
#include <functional>
class U {
public:
template <class C>
U(C* p)
: f{[p]{ p->foo(); }}
{
}
void work()
{
f();
}
private:
std::function<void()> f;
};
#包括
U类{
公众:
模板
U(C*p)
:f{[p]{p->foo();}
{
}
无效工作()
{
f();
}
私人:
std::函数f;
};
()
注意,java中的函数默认是虚的,而不是C++中的.< /P>,显然对于ARDUIO,我只能访问有限数量的头文件,即使我将编译器设置成C++ 11,所以我希望有一个语法或架构解决方案,而不是一个STDLIB解决方案。@ MarkJeronimus,基本上,重新发明<代码> STD::函数< /C>和B。inders.理论上应该是可能的。@MarkJeronimus我重新发明了
std::function
。这可能会给你一些启发。你只需要实现你需要的功能(操作符()
和函数库)。我刚刚详细研究了你的代码。这是否意味着我要调用B
的每个函数都必须添加一个成员?@MarkJeronimus在这种方法下,是的。或者,如果你知道你将要使用的所有派生类,你可以使用std::variant
。然后,你可以在任意一个CA中使用std::visit
e、 类型擦除仅对有限的类型集有效。