为什么会发生以下行为?是错误还是正常行为? (已在Visual Studio 2013和2017中进行了检查)似乎将虚拟函数用作getter或setter可能无法正常工作!

class A
{
public:
    __declspec(property(put = SetWidth)) int width;

    virtual void SetWidth(int value)
    {
        printf("A");
    }
};

class B : public A
{
public:
    virtual void SetWidth(int value) override
    {
        printf("B");
    }
};

int main()
{
    B b1;
    B* b2 = new B();

    b2->width = 4; // prints B
    b1.width = 4; // prints A. why? it should print B!!!
    (*(&b1)).width = 4; // prints B
    (*b2).width = 4; // prints B

    return 0;
}

最佳答案

尝试使用调度功能:

class A
{
public:
    __declspec(property(put = SetWidth)) int width;

    void SetWidth(int value)
    {
         SetWidthImpl(value);
    }

private:
    virtual void SetWidthImpl(int value)
    {
        printf("A");
    }
};

class B : public A
{
private:
    void SetWidthImpl(int value) override
    {
        printf("B");
    }
};

这样可以缓解该错误,直到对其进行处理为止。

07-24 09:15