Полиморфизм. Где он должен быть

в коде отсутствует полиморфизм, он должен быть в main. но все вроде сделано верно вот задание:2. На основе класса Complex, реализованного в лабораторной рабо-те №2, описать производный класс Vector, представляющий вектор в двумерном Эвклидовом пространстве. 2.1. Описать необходимые методы и дружественные функции для класса Vector. 2.2. Реализовать виртуальную функцию print(), выводящую значение объекта в формате, соответствующем смыслу этого объекта ( для комплексного числа и для вектора). 2.3. Реализовать необходимые способы приведения типов между классами Complex и Vector.
#include "stdafx.h" 
#include "conio.h" 
#include <iostream> 
using namespace std; 
class Complex 
{protected:
float Re, Im; //private
 
public: 
 
    Complex(float R,float M) //конструкторы с параметрами
 { 
 //Re = Im = 0; 
 Re=R;
 Im=M;
 } 
 
  Complex(void) //конструктор без параметров
 { 
 Re = Im = 0; 
 } 
Complex& operator - (Complex&C2);
Complex& operator *(Complex C2); //объявляем в классе
Complex& operator /(Complex C2);
 
 
 
virtual void Show() //метод для отображения переменной на экране
 { 
 if (Im > 0) 
 printf("(%.2f%;%.2f%)\n", Re, Im); 
 else printf("(%.2f%;%.2f%)\n", Re, Im); 
 } 
 Complex  operator + (Complex C2) //а здесь в классе  Complex -оператор
 { 
 Complex C; 
C.Re = Re + C2.Re; 
C.Im = Im + C2.Im; 
 return C; 
 } 
 float priv (float Re) 
 { 
 return Re; 
 }; 
 float mnim (float Im) 
 { 
 return Im; 
 }
}; 
//закрывается класс
 
class Vector:public Complex
 
{
 
    
public:
     Vector (float re, float im)
     {
         Re=re; Im=im;
        
     }
    virtual  void Show()
 
    {printf("(%.2f%;%.2f%)\n",Re, Im); }
    
/*Vector& Complex& Complex:: operator *(Complex&C2)*/ 
 
     
     
     Vector& operator *(float c)
{
    Vector tmp(0,0);
    tmp.Re=Re*c;//для которого вызван метод перед *
    tmp.Im=Im*c;
 
return tmp;
}
    
     Vector& operator=(Complex c) 
 { 
 Re=c.priv(Re); 
 Im=c.mnim(Im); 
 return Vector(Re,Im); 
 }
};
 
//------------------
 
 
Complex& Complex::operator - (Complex&C2) 
 { 
 Complex C; 
C.Re = Re - C2.Re; 
C.Im = Im - C2.Im; 
 return C; 
 } 
 
 Complex& Complex::operator *(Complex C2) // Complex:: означает,что оператор относиться к классу
{Complex C;
C.Re=(Re*C2.Re-Im*C2.Im);
C.Im=(C2.Re*Im+Re*C2.Im);
return C;
}
 
Complex& Complex::operator /(Complex C2)
{
Complex C;
C.Re=(Re*C2.Re+Im*C2.Im)/(C2.Re*C2.Re+C2.Im*C2.Im);
C.Im=(C2.Re*Im-C2.Im*Re)/(C2.Re*C2.Re+C2.Im*C2.Im);
return C;
}
 
int main() 
 {
     Complex a(5,6); 
     
 
 printf("object a "); 
 a.Show(); 
 Complex C; 
 C.Show();
 Complex b(8,9); 
 printf("object b "); 
  
 b.Show(); 
 Complex c = a.operator +(b); 
 printf("a+b "); 
 c.Show(); 
 c=a+b;//вызов в операторном вмде
  c.Show();
 c = a.operator - (b); //
  c=a-b;
 printf("a-b "); 
 c.Show(); 
 c=a*b;
  printf("a*b ");
  c.Show();
  
  c=a/b;
   printf("a/b ");
  c.Show(); 
  //-----------------
  Vector v(4,4);
  printf("re*c ");
  v.Show();
 
Vector d(7, 8); 
 printf("vector a "); 
 d.Show(); 
 Vector e(2, 10); 
 printf("vector b "); 
 e.Show(); 
 printf("vector a*b ");   
 Vector m=d*2;
  m.Show(); 
printf("vector a+b "); 
 (d+e).Show(); 
 _getch(); 
 return 0; 
 };
5 ответов

Полиморфизма тут нет. 1. надо в Complex добавить виртуальный деструктор. 2. в main вместо таких записей
Complex a(5,6); Vector d(7, 8);
написать
Complex *a = new Complex(5, 6)
Complex *d = new Vector(7, 8)
или так
Complex *pComplex;
Complex a(5, 6);
Vector d(7, 8)
 
pComlex = &a;
a->show();
 
pComplex = &d;
d->show();


Complex *a = new Complex(5, 6) Complex *d = new Vector(7, 8)
kylroma, это и является полиморфизмом?


sodaily, вызов виртуального метода нужно ещё добавить. Как в последнем примере. Последний пример лучше - один указатель на базовый класс указывает на объекты базового и производного класса и вызывают виртуальный метод.Вот исправил опечатку
Complex *pComplex;
Complex a(5, 6);
Vector d(7, 8)
 
pComlex = &a;
pComlex ->show();
 
pComplex = &d;
pComlex ->show();


kylroma, все работает спасибо) только вот не до конца понимаю в чем заключается тут полиморфизм и где он тут, выделенное является им?


sodaily, Надо код увидеть. Попробую объяснить про полиморфизм подругому. Суть в том, чтобы вызвать виртуальный метод разных объектов одинаково. Например можно сделать обычную функцию myFunc так:
...//где-то там определены классы Complex и Vector
 
void myFunc(Complex *pCom)
{
 pCom->show();
}
 
int main()
{
Complex a(5, 6);
Vector d(7, 8)
 
myFunc(&a)
myFunc(&d)
}
Будут вызваны в первом случае метод show(), который определён в классе Complex, во втором случае метод из класса Vector. Если в классе Complex убрать "virtual" перед методом show(), то в функции myFunc(Complex *pCom) два раза будет вызван метод из класса Complex. Поэтому, если без полиморфизма, мне пришлось бы писать две функции с одинаковым кодом, но с разными аргументами:
void myFunc(Complex *pCom)
{
 pCom->show();
}
 
void myFunc(Vector *pCom)
{
 pCom->show();
}
 
int main()
{
Complex a(5, 6);
Vector d(7, 8)
 
myFunc(&a)
myFunc(&d)
}