How to make a subclass call from a base class reference in a polymorphic hierarchy

I am currently writing a program that models various types of numbers and manipulates them polymorphically in a Set object (already written and tested). My inheritance relations are as follows: Multichannel (all virtual functions, virtual class) inherited in pairs, complex, rational All subclasses have basically the same functions with different parameters.

The problem I am facing is with the following functions:

Multinumber& Complex::operator=(const Multinumber &rhs)
{
   imag=rhs.imag;
   real=rhs.real;
   return *this;
}

Since I consider this polymorphically, my return types and parameters must all be of type Multinumber in order to override the parameters of the base class. However, I have a terrible time to compile this. I get a boat of errors line by line:

error: 'const class Multinumber' has no member named 'imag'

. . , Multinumber & rhs , ? .

:

class Multinumber
{
public:
virtual Multinumber& operator+(Multinumber&);
virtual Multinumber& operator=(Multinumber&);
virtual bool operator==(Multinumber&);
virtual string object2string();
virtual Multinumber& makeobject(double, double)=0;
};
+3
5

, . :

Multinumber& Complex::operator=(const Multinumber &rhs){
    const Complex & _rhs = dynamic_cast<const Complex &>(rhs);
    imag=_rhs.imag;
    real=_rhs.real;
    return *this;
}
+1

, :

Multinumber& Complex::operator=(const Multinumber &rhs)

, Multinumber Complex. , ? :

  • , Complex (, dynamic_cast). , ? , .
  • , Multinumber& Complex::operator=(const Complex &rhs): Rational Complex .

, , , , .

, , , : " , Multinumber & rhs Complex": Complex, - .

EDIT , , operator= Multinumber, , Complex::operator= (. ).

+1

, , rhs Complex &.

. , Complex& Complex::operator=(const Complex &rhs)? , , , .

0

. ++ (, , ) . Complex& Complex::operator=(const Multinumber &rhs) Multinumber& Multinumber::operator=(const Multinumber&)

, , . ++, IFAIK. , , , . , . Pair Complex? , Steve dynamic_cast . , operator = Multinumber, , .

: . , ( ). , Multinumber& operator+(Multinumber&) - , , , , , , , , . - Multinumber& operator+=(const Multinumber&). Complex :

Complex& Complex::operator+=(const Multinumber &rhs){
    const Complex & _rhs = dynamic_cast<const Complex &>(rhs);
    imag+=_rhs.imag;
    real+=_rhs.real;
    return *this;
}

, operator+ new. , - C struct ++. - ( , , , , , , ):

class Multinumber
{
public:
  virtual Multinumber* operator+(const Multinumber&);
  virtual Multinumber& operator=(const Multinumber&);
  virtual bool operator==(const Multinumber&) const;
  // etc.
};

class MultinumberOuter
{
  std::unique_ptr<Multinumber> impl_;
public:
  explicit MultinumberOuter(Multinumber* pimpl) : impl_(pimpl) {}

  MultinumberOuter operator+(const MultinumberOuter& src) const {
    return MultinumberOuter(impl_->operator+(*(src.impl_)));
  }

  MultinumberOuter& operator=(const MultinumberOuter& src) {
    impl_->operator=(*(src.impl_));
    return *this;
  }

  bool operator==(const MultinumberOuter& src) const {
    return impl_->operator==(*(src.impl_));
  }
  // etc.
};

, , . , , , , .

0

Refuse. It's impossible. @beldaz is right that covariant arguments are not allowed in C ++, but skips the real point: this would not help, even if they were typical.

See my answer in:

C ++ Annotation A class cannot have a method with a parameter of this class

0
source

Source: https://habr.com/ru/post/1776961/


All Articles