Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator=, и наследование 
V
    Опции темы
Romikgy
Дата 12.1.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Воть и у мя созрел вопросик, к ув. гуру smile

Есть 
Код

class RSS
{
public :
RSS& operator=(const mystr& x);
}
class RStringList: public RSS {};


почему так работает
Код

RSS x;
mystr y;
x=y;

а так нет
Код

RStringList x;
mystr y;
x=y;

 smile 
дает такую ошибку
Цитата

[C++ Error] Unit1.cpp(27): E2285 Could not find a match for 'RStringList::operator =(string)'


Это сообщение отредактировал(а) Romikgy - 12.1.2007, 16:14


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
PoloS
Дата 12.1.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 29.12.2006
Где: МО, г. Одинцово

Репутация: 1
Всего: 5



Возможно из за того, что по умолчанию все члены класса  - private, и кога ты наследуешь класс, метод operator= не наслеуется в child класс. исправь так

Код

class RSS
{
public:
RSS& operator=(const mystr& x);
}
class RStringList: public RSS {};


Это сообщение отредактировал(а) PoloS - 12.1.2007, 15:58
PM MAIL ICQ   Вверх
Romikgy
Дата 12.1.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



PoloS, нет все в 
Цитата(PoloS @  12.1.2007,  14:57 Найти цитируемый пост)
public:




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sartorius
Дата 12.1.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



ИМХО присваивание не должно наследоваться, тк возможно неполное заполнение полей потомка
PM MAIL ICQ   Вверх
Romikgy
Дата 12.1.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



но у меня нет доп. полей 
Цитата(PoloS @  12.1.2007,  14:57 Найти цитируемый пост)
class RStringList: public RSS {};

 smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sartorius
Дата 12.1.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Romikgy, чего то в инете ничего подходящего не нашел. Вот помню у Скота Майерса в Правилах программирования на C++ что-то было такое....  Я думаю компилятор и не смотрит добавил ты поля или нет, просто наследование operator= запрещено видимо по тем же причинам, по которым запрещено присвоение предка потомку запрещено.

Это сообщение отредактировал(а) Sartorius - 12.1.2007, 17:01
PM MAIL ICQ   Вверх
Earnest
Дата 12.1.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Все просто: оператор = (const mystr&) определен для класса RSS, и не определен для класса RStringList.
Компилятор не производит преобразование левого аргумента при поиске подходящей функции.
Но ты можешь написать так:
Код

RStringList x;
mystr y;
x.operator = (y);


Вот если бы твой оператор  = был стандартным оператором присваивания (с соотв. аргументом), то компилятор бы сгенерировал за тебя такой оператор у производного класса.

Не рекомендуется писать такие функции в виде оператора присваивания, т.к. строго говоря это не присваивание, а некоторая инициализация. Лучше писать явно: void Init (const mystr&).  

Вот, кстати, из той же оперы: если определить конструктор RSS(const mystr&), то строить RStringList из mystr все равно без явного написания конструктора не получится.


--------------------
...
PM   Вверх
Axxent
Дата 12.1.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 25.3.2004
Где: Новосибирск

Репутация: 2
Всего: 5



Конструкторы и присваивание не наследуются вообсче. Если уж сильно надо то делаем оператор и в нем вызываем оператор из базового класса.

Это сообщение отредактировал(а) Axxent - 12.1.2007, 18:23
PM MAIL ICQ   Вверх
Sartorius
Дата 12.1.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Earnest, у меня 

Код

x.operator = (y);


не проходит (VS2005), operator= действительно есть у потомка, только это простой оператор копирования. smile 

Цитата

Der::operator =' : cannot convert parameter 1 from 'int' to 'const Der &


PS Intelliscence пишет его прототип как в Base  smile 

Это сообщение отредактировал(а) Sartorius - 12.1.2007, 18:35
PM MAIL ICQ   Вверх
Romikgy
Дата 12.1.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Earnest, 
Цитата(Earnest @  12.1.2007,  16:42 Найти цитируемый пост)
Вот, кстати, из той же оперы: если определить конструктор RSS(const mystr&), то строить RStringList из mystr все равно без явного написания конструктора не получится. 

это я уже заметил....

а что еще не наследуется , кроме перегрузки операторов? или это только для оператора присваивания?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Axxent
Дата 12.1.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 25.3.2004
Где: Новосибирск

Репутация: 2
Всего: 5



Только для присваивания и конструкторов. Впрочем наследовать любые операторы - весьма неблагодарное занятие, возможно некоторые операторы не наследуются принципиально, но все же рекомендуется переопределять в производных классах все имеющиеся операторы.
PM MAIL ICQ   Вверх
Romikgy
Дата 12.1.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Если кто вспомнит какие либо тонкости , плз пишите.

А так спасибо всем!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1120 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.