【发布时间】:2025-12-09 09:30:01
【问题描述】:
我想创建类似的界面
class Scalar {
public:
Scalar() {}
virtual ~Scalar() {}
//virtual members operators
virtual Scalar& operator+() const = 0;
virtual const Scalar operator-() const;
virtual Scalar& operator=() = 0;
virtual Scalar& operator+=() = 0;
//...
};
我也打算使用一些朋友功能,例如:
friend const Scalar operator+(const Scalar&, const Scalar&);
但是当我派生抽象类并创建派生类时出现问题,比如说:
class RealNumber: public Scalar {
public:
friend const RealNumber operator+(const RealNumber&, const RealNumber&);
//some definitions...
};
根据这个逻辑,我需要为从Scalar 派生的每个新类定义一个新的朋友operator+ 重载。有没有办法解决这个问题并避免在所有派生类中声明这些朋友?
【问题讨论】:
-
这是XY problem。
-
如果在派生类中使用友元函数,您还可以访问从基类继承的受保护成员。但这只有在访问变量的静态类型来自(在这种情况下)Y 而不是 X 的多态变量(就像在你的情况下)时才有效。
-
您通常不希望首先在层次结构中重载类型的运算符。这些设计在实践中很容易崩溃。缺乏多重分派只是造成这种情况的原因之一。
-
为什么是好友功能??您可以创建一个虚拟 + 运算符。但这不是最好的方法
-
我想你会发现这种方法会充满错误和问题。它不仅仅是 C++,而是在我熟悉的每一种 OOP 语言中。
标签: c++ polymorphism operator-overloading abstract-class friend