c++ - 在 C++ 中转换函数指针

标签 c++ polymorphism function-pointers

假设我有两个类,A 和 B:

class A
{
public:
    typedef void (*Handler)( A * a );

    Handler handler;

    void foo() ( handler( this ); }
};

class B : public A
{
};

假设我有一个函数

void bar( B * b );

那我可以走了吗

B b;
b.handler = bar;???

如果我声明 void bar( A * a ) 那么一切都很好,但是我必须将 a 转换为 B*这是丑陋的。我无法对 typedef 进行模板化,那么有什么好的方法可以做到这一点吗?

最佳答案

不,没有。

您违反了 LSP:不能使用任何随机 A* 调​​用 b.handler(),而基类 promise 可以。

B b;
b.handler = bar; // This doesn't compile!
A a2;
b.handler(&a2); // As this would call bar(B*) with an A*

在这种情况下可以有不同的类型,但前提是参数是逆变的并且返回值是协变的。

关于c++ - 在 C++ 中转换函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15572611/

相关文章:

C++ 工厂制造和多态性 -> 调用映射迭代器访问的实例的子类虚方法

python - 在 Python 中注册要在事件上调用的函数

c++ - opencv函数实现

c++ - 尝试从 vector 中获取 unique_ptr 元素后出错

java - 使用方法重载处理违反 'Liskov substitution principle' 的类

c# - 声明父类(super class)时无法访问子类的通用属性

rust - 无法移出 `Fn` 闭包中捕获的外部变量

c++ - 将函数传递给函数并使用头文件时出错

c++ - 如何将函数静态应用于非类型模板包的各个元素并对结果求和?

c++ - 在 TCP 客户端上接收数据包中的数据