gpt4 book ai didi

c++ - 非虚基的多态成员类

转载 作者:行者123 更新时间:2023-12-03 05:59:27 24 4
gpt4 key购买 nike

首先,在我找到的多态性答案中,它总是像“如果基函数不是虚拟的并且派生对象存储在基类类型的指针中,那么你就不能调用派生函数”。但当你想要这样做时,他们永远不会告诉你该怎么做。这就是我需要做的。

我有一个我无法控制的基类B。它是开源的(来自 Arduino 库的 TwoWire),如果我进行本地修改,它对其他人将不起作用。

我有一个派生类 D 和一个用户类 U,我都可以控制它们。

实际上,我希望用户透明地使用我的类 U 并使用 BD 作为参数,将其存储在一个成员,并在成员函数中使用它。

我在学习virtual之前的徒劳尝试是在基类上需要的:

#include <iostream>

using namespace std;

class B {
public:
void foo() { cout << "base foo\n"; };
};

class D : public B {
public:
void foo() { cout << "derived foo\n"; };
};

class U {
public:
U(B *b) : b(b) { }
void work() { b->foo(); }
private:
B *b;
};

int main() {
B b; U u1{&b}; u1.work(); // "base foo"
D d; U u2{&d}; u2.work(); // I need this to somehow print "derived foo"
return 0;
}

我可以通过创建一个抽象包装类和两个包装 BD 的子类来解决这个问题,但这将使自定义类的总数达到5. 我希望得到一个只有 2 个自定义类(或最多 3 个)的解决方案。

注意我刚刚开始学习 C++,来自 Java

最佳答案

由于不可能使成员函数虚拟,因此您必须通过类型删除来模拟动态分派(dispatch):

#include <functional>

class U {
public:
template <class C>
U(C* p)
: f{[p]{ p->foo(); }}
{
}
void work()
{
f();
}
private:
std::function<void()> f;
};

( live demo )

请注意,Java 中的函数默认是虚拟的。不在 C++ 中。

关于c++ - 非虚基的多态成员类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58670302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com