成员函数指针和继承
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
是从其基类继承的.所以,不,据我所知,你无法解决这个问题。
不是我所希望的,但当时就是这样。以上是关于成员函数指针和继承的主要内容,如果未能解决你的问题,请参考以下文章