C 中的虚拟赋值运算符
C 中的赋值运算符可以声明为虚拟,但出现了一个基本问题:为什么这是必要的?其他运算符也可以虚拟吗?
赋值运算符是否必须是虚拟的?
与普遍看法相反,赋值运算符本质上并不需要是虚拟的。
理解虚函数和参数继承
虚函数启用多态性,允许派生类覆盖基类函数。但是,了解虚函数忽略参数继承至关重要。
演示参数继承限制的示例:
考虑以下包含类 B 和 D 的示例,其中B 有一个虚拟的赋值运算符,D 覆盖它:
class B { public: virtual B& operator=(const B& right) { x = right.x; return *this; } int x; }; class D : public B { public: virtual D& operator=(const D& right) { x = right.x; y = right.y; return *this; } int y; };
在这种情况下,尽管B::operator= 的虚指定,该调用不会被视为 D 中的虚函数,因为参数和返回值不同。
使用 Virtual 重载具有默认值的运算符
虽然赋值运算符本质上不是虚拟的,但定义一个包含派生默认值的虚拟函数可能会很有用类。
class D : public B { public: virtual D& operator=(const D& right) { x = right.x; y = right.y; return *this; } virtual B& operator=(const B& right) { x = right.x; y = 13; // Default value return *this; } int y; };
此方法允许您在分配给 B 引用时为 D 对象分配默认值。
使用 RTTI 进行综合类型处理
最后,您可以使用运行时类型信息(RTTI)来处理涉及您的类型的虚函数
virtual B& operator=(const B& right) { const D *pD = dynamic_cast<const D*>(&right); if (pD) { x = pD->x; y = pD->y; } else { x = right.x; y = 13; // Default value } return *this; }
通过组合这些技术,您可以全面处理涉及继承的赋值操作,并确保派生类型的正确行为。
以上是为什么 C 语言中需要虚拟赋值运算符,其他运算符可以设为虚拟吗?的详细内容。更多信息请关注PHP中文网其他相关文章!