在派生类

时间:2017-11-24 18:53:49

标签: 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

一切似乎都很好。

我的问题是:此代码是否正确?还是我踩着未定义的行为?我可以直接使用指向派生类对象的基类成员函数的指针吗?

1 个答案:

答案 0 :(得分:3)

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

反过来甚至不实际编译:

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

错误很明显:

  

错误:无法将模板参数'&amp; Base :: foo'从'[...](Base :: )()const}'转换为'[...](Der :: < / em>)()const'

我使用[...]来减少它。