成员函数指针和继承

Posted

技术标签:

【中文标题】成员函数指针和继承【英文标题】:Memberfunction pointers and inheritance 【发布时间】:2014-05-04 22:28:28 【问题描述】:

我正在使用模板来存储成员函数指针。但是我现在有一个继承问题。我不知道这是否是编译器错误,但当我这样做时

&std::map<T1, T2>::size

我得到一个对 std::_Tree 而不是 std::map 的调用。如果我这样做了

&std::map<T1, T2>::swap

我收到一个对 std::map 的调用。 (在 Visual Studio 2013 上测试)

现在查看 std::map 的代码,它继承自 std::_Tree 定义大小但不交换。我现在的问题是,是否有办法让类型在所有情况下都显示为 __thiscall std::map::* 。因为得到它作为 std::_Tree 并不是我真正想要的。

【问题讨论】:

你为什么在乎?指向基类成员的指针可以与派生类的实例一起使用。 因为我用 typeid(class) 作为键保存了这些指针。如果我查询 std::map 我希望它给我 std::map 函数。如果我将其中一些作为 std::_Tree 得到,这是不可能的 @ACB 您在基本层面上做的非常非常错误。为什么你会在 C++ 中这样做? 将函数绑定到 lua。它适用于其他一切 【参考方案1】:

恐怕你无能为力。允许标准库的实现者从基类继承方法

17.6.5.11 派生类[派生]

1 - 实现可以从具有为实现保留名称的类派生 C++ 标准库中的任何类。

它没有说明是否允许从基类继承方法(和其他成员),但显然不是禁止的。

即使是签名也可能不是你所期望的:

17.6.5.5 成员函数[member.functions]

2 - 一个实现可以在一个类中声明额外的非虚拟成员函数签名:

通过将具有默认值的参数添加到成员函数签名186; [...]

186) 因此,C++ 标准库中类的成员函数的地址具有未指定的类型。

对不起:)

【讨论】:

可能是这样。但是 &std::map::size 没有办法返回指向 std::map 而不是 std::tree 的函数指针。我的意思是我可以投射它,但这很冗长。我的意思是 &std::map::size 我什至告诉编译器我想要一个 std::map 的函数指针 @ACB 从技术上讲,没有称为std::map::size方法,只有size 已知的名称/标识符std::map 是从其基类继承的.所以,不,据我所知,你无法解决这个问题。 不是我所希望的,但当时就是这样。

以上是关于成员函数指针和继承的主要内容,如果未能解决你的问题,请参考以下文章

具有类私有成员和函数指针的继承结构

不同类的成员函数指针的C++映射

指向父类成员函数的函数指针

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

向下转换指向成员函数的指针

C++函数指针与成员函数指针