C++ 在C++;

C++ 在C++;,c++,inheritance,operator-overloading,C++,Inheritance,Operator Overloading,我读了很多关于运算符重载和继承的讨论,但是关于子类中的运算符重载仍然有一点。我的例子专门针对像*、+、-这样的二进制算术运算符,以及作为成员函数的运算符 在派生类中重载算术运算符的正确方法是什么?派生类继承自基类,基类也重载同一运算符。例如:我们可以调用派生类中父类的基(复制)构造函数,以便将任务委托给能够处理此任务的父类。然而,对于这些运营商,我没有看到类似的方法 我是否可以/应该执行派生类中的所有任务(例如:也可以添加或删除基类的成员),或者以某种方式将这些任务委托给拥有所考虑成员的基类(或

我读了很多关于运算符重载和继承的讨论,但是关于子类中的运算符重载仍然有一点。我的例子专门针对像*、+、-这样的二进制算术运算符,以及作为成员函数的运算符

在派生类中重载算术运算符的正确方法是什么?派生类继承自基类,基类也重载同一运算符。例如:我们可以调用派生类中父类的基(复制)构造函数,以便将任务委托给能够处理此任务的父类。然而,对于这些运营商,我没有看到类似的方法

我是否可以/应该执行派生类中的所有任务(例如:也可以添加或删除基类的成员),或者以某种方式将这些任务委托给拥有所考虑成员的基类(或者这样做是否可能/可行?)

我有一个非常小和简单的代码来测试这个案例。我有一个名为“OpBase”的基类,当然还有一个派生(来自OpBase)类“OpDerived”。两者都声明/定义一个成员变量(int类型)。在本例中,我将在派生类中的运算符重载中同时乘以基类和派生类成员。在那种情况下,什么是合适的选择?这个问题可能没有一个绝对的答案,但是在派生类中做任何事情对于可维护性问题来说似乎有点问题

类OpBase
{
受保护的:
int last;
显式OpBase(){last=1;}
显式OpBase(int-la){this->last=la;}
OpBase运算符*(常量OpBase和rhs){
OpBase-op;
op.last*=rhs.last;
返回op;
}
};
类OpDerived:public OpBase
{
公众:
int优先;
显式OpDerived():第一(1){}
OpDerived运算符*(常量OpDerived和rhs){
opop;
op.first*=rhs.first;
op.last*=rhs.last;
返回op;
}
OpDerived(常量OpDerived和rhs):OpBase(rhs){
此->第一个=rhs.first;
}
};

委派
操作符*
很困难(因为它制造了一个新实例),但委派
操作符*=
很容易(因为它在适当的位置工作,不会导致切片)。因此,只要在后者的基础上始终如一地实施前者

OpBase& OpBase::operator*=(const OpBase& other) {
  // Actual logic goes here.
  last *= other.last;
  return *this;
}

// Could also be made a non-member with two parameters
OpBase OpBase::operator*(const OpBase& other) {
  // Standard boilerplate.
  OpBase ret(*this);
  ret *= other;
  return ret;
}

OpDerived& OpDerived::operator*=(const OpDerived& other) {
  OpBase::operator*=(other);
  // Additional logic specific to OpDerived goes here.
  first *= other.first;
  return *this;
}

// Could also be made a non-member with two parameters
OpDerived OpDerived::operator*(const OpDerived& other) {
  // Standard boilerplate again.
  OpDerived ret(*this);
  ret *= other;
  return ret;
}

在我看来,这是属于codereview.stackexchange.ComUser207933的,事实上我问这个问题是为了寻找最佳实践背后的原因。对于运算符重载,当然有一些指导原则,例如,但我想知道遵循这些指导原则的原因是什么。我只是试着用一个简单的代码来解释这个问题。此外,我认为,我的问题有一些有用的答案。