Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2015, 15:23   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Реализация операторов при полиморфизме

Всем доброго дня !

Подскажите пожалуйста , можно ли при полиморфизме реализовать

выполнение операторов :

Код:
operator ++ ()
 
operator ++ (int)
 
operator = ()
 
operator + ()
и т.д.
RAFA91 вне форума Ответить с цитированием
Старый 18.07.2015, 15:51   #2
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

тут.
Код:
operator++()
возвращает ссылку на объект это нечто ++i;
Код:
operator++(int)
возвращает новый объект - это нечто i++;
/////////////
Зы
Можно использовать в контейнерах, в математике, вообщем там где есть смысл.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.07.2015 в 15:53.
Perchik71 вне форума Ответить с цитированием
Старый 19.07.2015, 16:20   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

а как же быть с полиморфизмом ?

при выполнении операции присвоения
Код:
*a = *c;
и других

операциях применять
Код:
dynamic_cast
?

Код:
#include <stdio.h>


class A

{

protected:

	int *x;

public:

	A() : x(new int(0)) {}
	A(int a) : x(new int(a)) {}
	A(const A &rhs) : x(new int(*rhs.x)) {}
	virtual ~A()  {delete x;}
	int fgj() const {return *x;}
	virtual void kac() const {printf("\nHello class A this = %p x = %p\n",this,x);}
	

};

class B : public A

{

private:

	int *y;

public:

	B() : y(new int(0)) {}
	B(int a) : y(new int(a)) {}
	B(int a, int b) : A(b), y(new int(a)) {}
	B(const B &rhs) : A(rhs), y(new int(*rhs.y)) {}
	~B()  {delete y;}
	int fnz() const { return *y;}
	void kac() const {printf("\nHello class B this = %p y = %p\n",this,y);}
	
};

int main()

{
    A *c = new B(12,78);
    printf("\nc = %d %d\n",dynamic_cast <B *> (c)->fnz(),c->fgj());
    printf("\n***************************\n");
     A *a = new B; 
     A *v = new B(23,67);
     printf("\na = %d %d\n",dynamic_cast <B *> (a)->fnz(),a->fgj());
     printf("\nv = %d %d\n",dynamic_cast <B *> (v)->fnz(),v->fgj());
     printf("\n+++++++++++++++++++++++++++++\n");
     B *ap = dynamic_cast <B *> (a);
     B *cp = dynamic_cast <B *> (c);
     *ap = *cp;
     printf("\na = %d %d\n",dynamic_cast <B *> (a)->fnz(),a->fgj());
     printf("\nc = %d %d\n",dynamic_cast <B *> (c)->fnz(),c->fgj());
     return 0;
}
RAFA91 вне форума Ответить с цитированием
Старый 19.07.2015, 19:15   #4
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Очень интересно, а зачем вы наследуете? если порождаете новый инструментарий поверх предка? зачем динамиком? вы используете указатель, его тип менять нет сложности, да и смысла нет, вообще вам нужно создать общий объект 2 объектов и в нём описать методы сравнения... тогда все оба преобразуются в предка и сравниваются. и всем до фени, им объектам тоже, что там..
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.07.2015, 13:15   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

необходимо выполнить

Код:
  *a = *v;
, где

Код:
A *a = new B; 
    
    A *v = new B(23,67);
есть мысль сделать оператор = класса А виртуальным

Код:
virtual A & operator = (const A &rhs)
    {
                if (this == &rhs) return *this;
        *x = *rhs.x;
        return *this;
    }
в классе В написал так

Код:
A & operator = (const A &rhs) 
 
    {
                if (this == &rhs) return *this;
        *x = *rhs.x;
        *y = *rhs.y;
        return *this;
    }
в реззультате чкго получил ошибку .

подскажите пожалуйста , что не так , и как это можна устранить.
RAFA91 вне форума Ответить с цитированием
Старый 21.07.2015, 20:16   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
что не так
В классе А нет переменной y, так что все логично.

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
как это можна устранить.
Получить адрес ссылки на А, сделать dynamic_cast указателя на А на указатель на В, присваивать из указателя.

Только дикость все это.
Храните указатели и всех делов.
Для чего все это нужно?
waleri вне форума Ответить с цитированием
Старый 22.07.2015, 08:17   #7
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

В классе A у него она в протекте, вообще мне класс тоже не очень нравиться, Во-первых оператор виртуальный, а значит вы выполняете вызов, сначала предка, а потом потомка, а где и какая ошибка, супер вопрос. Скорее всего Вы разыменовываете нулевой указатель или указатель на не инициализированную память. А так пишите вашу ошибку.

Код:
if((this != &rhs) && (rhs.x && rhs.y))
{
    *x = *rhs.x;
    *y = *rhs.y;
}
return *this;
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 22.07.2015 в 08:20.
Perchik71 вне форума Ответить с цитированием
Старый 22.07.2015, 17:28   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

В классе А в протекте Х.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли при перегрузке операторов задавать дополнительные параметры? Вероника99 Помощь студентам 1 16.05.2015 15:18
Проблема при перегрузке операторов в классе erslgoeirjh Общие вопросы C/C++ 0 08.11.2013 18:06
Тип возвращаемого значения при перегрузке операторов Igor95 Общие вопросы C/C++ 1 22.04.2013 23:02
Перегрузка виртуальных функций при полиморфизме Стремящийся Общие вопросы C/C++ 2 06.05.2012 10:23
Ошибка при перегрузке операторов. bill Общие вопросы C/C++ 1 26.01.2012 21:17