指向虚拟成员函数的指针在基类的构造函数中是否有效?

ano*_*orm 12 c++ member-function-pointers

我的问题不是从基类构造函数调用虚拟成员函数,而是指向虚方法成员函数的指针在基类构造函数中是否有效.

鉴于以下内容

class A
{
    void (A::*m_pMember)();

public:
    A() :
        m_pMember(&A::vmember)
    {
    }

    virtual void vmember()
    {
        printf("In A::vmember()\n");
    }

    void test()
    {
        (this->*m_pMember)();
    }
};

class B : public A
{
public:
    virtual void vmember()
    {
        printf("In B::vmember()\n");
    }
};

int main()
{
    B b;
    b.test();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于所有兼容的c ++编译器,这会产生"In B :: vmember()"吗?

AnT*_*AnT 3

指针是有效的,但是您必须记住,当通过指针调用虚拟函数时,它始终根据左侧使用的对象的动态类型进行解析。这意味着当您从构造函数调用虚拟函数时,直接调用它还是通过指针调用它并不重要。在这两种情况下,调用都将解析为其构造函数当前正在工作的类型。当您在对象构造(或销毁)期间调用虚拟函数时,这就是虚拟函数的工作方式。

另请注意,指向成员函数的指针通常在初始化时不附加到特定函数。如果目标函数是非虚函数,则可以说该指针指向特定函数。但是,如果目标函数是虚拟的,则无法说出指针指向的位置。例如,语言规范明确指出,当您比较(相等)两个恰好指向虚函数的指针时,结果是未指定的