C++ 非虚拟基的多态成员类

C++ 非虚拟基的多态成员类,c++,arduino,polymorphism,type-erasure,dynamic-dispatch,C++,Arduino,Polymorphism,Type Erasure,Dynamic Dispatch,首先,如果我找到的所有多态性答案都是“如果基函数不是虚函数,并且派生对象存储在base类型的指针中,那么就不能调用派生函数”。但是当你想做的时候,他们从来不会告诉你该做什么。这就是我需要做的 我有一个我无法控制的基类B。它是开源的(TwoWire来自Arduino库),如果我进行本地修改,它将不适用于其他人 我有一个派生类D和一个用户类U,这两个类我都可以控制 实际上,我希望用户透明地使用我的类U,使用B或D作为参数,将其存储在成员中,并在成员函数中使用 我在学习虚拟之前的徒劳尝试需要在基类上进

首先,如果我找到的所有多态性答案都是“如果基函数不是虚函数,并且派生对象存储在base类型的指针中,那么就不能调用派生函数”。但是当你想做的时候,他们从来不会告诉你该做什么。这就是我需要做的

我有一个我无法控制的基类
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、 类型擦除仅对有限的类型集有效。