c++ - 在派生类的对象上使用指向基类成员函数的指针

标签 c++ c++11

考虑以下代码片段:

struct Base {
    std::string foo () const { std::cout << "Base::foo()\n"; return "X"; }
};

struct Der : Base {};

struct Ptr : std::integral_constant<std::string (Base:: *) () const, &Base::foo> {};

用法是这样的:

Der der;
std::string s = (der.*Ptr::value) ();
std::cout << s << "\n";

输出如愿:

Base::foo()
X

一切似乎都很好。

我的问题是:这段代码是否正确?还是我踩到了未定义行为的土地?我可以直接在派生类的对象上使用指向基类成员函数的指针吗?

最佳答案

粗略地说,成员属于子对象,因此您必须使用其类型来识别它。确实非常好。

另一种方式实际上甚至不能编译:

struct Ptr : std::integral_constant<std::string (Der:: *) () const, &Der::foo> {};

错误很明显:

error: could not convert template argument '&Base::foo' from '[...] (Base::)() const}' to '[...] (Der::)() const'

我使用 [...] 来减少一点。

关于c++ - 在派生类的对象上使用指向基类成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47478722/

相关文章:

c++ - 当数据在 C++ 中不一致时,将文本文件中的数据读入二维数组

c++ - C++11 和 C++17 基于范围的 For 循环是否可以迭代到特定位置而不是 map 的整个范围?

c++ - LLVM:在程序中实现安全的多实例环境

c++ - 包含“类型”成员的 union

c++ - 字符串文字的 const 限定符

c++ - 右值是否作为参数传递给函数内部的左值?

c++ - 模板化特殊成员(operator=)的重载解析

c++ - auto 声明的变量有时是通过引用?

c++ - C++11的array end()如何找到数组结尾

c++ - 创建构建框架以支持编译支持多平台的代码