为什么会发生以下行为?是错误还是正常行为? (已在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");
}
};
这样可以缓解该错误,直到对其进行处理为止。