Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / перегрузка операторов и наследование / 15 сообщений из 15, страница 1 из 1
31.01.2007, 18:00
    #34297246
Dima_Mihalych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
есть
class TClass1
{
public:
int &operator = ( const int & );
};

есть

class TClass2 :public TClass1
{
public:

};

Когда делаю так компилятор ругается

TClass2 Class2;
Class2 = 25;

Пишет, что в TClass2 отсутствует оператор TClass2::operator = ( const int & )

Подскажите как из этой ситуации можно красиво выйти.
...
Рейтинг: 0 / 0
31.01.2007, 18:42
    #34297374
A. Fig Lee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Dima_Mihalychесть
class TClass1
{
public:
int &operator = ( const int & );
};

есть

class TClass2 :public TClass1
{
public:

};

Когда делаю так компилятор ругается

TClass2 Class2;
Class2 = 25;

Пишет, что в TClass2 отсутствует оператор TClass2::operator = ( const int & )

Подскажите как из этой ситуации можно красиво выйти.

попробовать:

Код: plaintext
Class2 = Class1( 25 );
or
[SRC c++]Class1 c1 = 25;
Class2 = c1;
[SRC c++]
...
Рейтинг: 0 / 0
31.01.2007, 19:03
    #34297426
перегрузка операторов и наследование
компилятор создает для TClass2 оператор присваивания по умолчанию, который скрывает ваш.
"открыть" можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
class TClass2: public TClass1
{
public:

	using TClass1::operator=;
};
...
Рейтинг: 0 / 0
31.01.2007, 19:25
    #34297452
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Голенков Владимиркомпилятор создает для TClass2 оператор присваивания по умолчанию, который скрывает ваш.
A разве присваивание по умолчанию выглядит нетак?
Код: plaintext
A& operator=(const A&)
Голенков Владимир
"открыть" можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
class TClass2: public TClass1
{
public:

	using TClass1::operator=;
};


Ради интереса набрал код - и с этой поправкой выдает ту же ошибку
...
Рейтинг: 0 / 0
31.01.2007, 19:35
    #34297471
перегрузка операторов и наследование
A разве присваивание по умолчанию выглядит нетак?
Код: plaintext
A& operator=(const A&)

именно. вот он и скрывает унаследованные имена (operator=)

Ради интереса набрал код - и с этой поправкой выдает ту же ошибку

какой компилятор и полный код ошибки?
...
Рейтинг: 0 / 0
31.01.2007, 19:54
    #34297500
перегрузка операторов и наследование
Ради интереса набрал код - и с этой поправкой выдает ту же ошибку

проверил: из доступных компиляторов проходит на VS2003/2005, g++ 3.2.3
не проходит на VS6 :(

такие дела
...
Рейтинг: 0 / 0
31.01.2007, 20:14
    #34297520
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Голенков Владимир A разве присваивание по умолчанию выглядит нетак?
Код: plaintext
A& operator=(const A&)

именно. вот он и скрывает унаследованные имена (operator=)

А че-й то он скрывает? Ведь унаследованный оператор принимает const int&? Разве так и должно быть?
Голенков Владимир
Ради интереса набрал код - и с этой поправкой выдает ту же ошибку

какой компилятор и полный код ошибки?

Visual Studio 6.0, код ошибки
VS6.0binary '=' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable conversion)
...
Рейтинг: 0 / 0
31.01.2007, 20:16
    #34297521
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Голенков Владимирпроверил: из доступных компиляторов проходит на VS2003/2005, g++ 3.2.3
не проходит на VS6 :(

такие дела
О как!
...
Рейтинг: 0 / 0
31.01.2007, 20:26
    #34297532
перегрузка операторов и наследование
А че-й то он скрывает? Ведь унаследованный оператор принимает const int&? Разве так и должно быть?

да, ибо таков стандарт..

вот пример, попробуйте закоментить using:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class Class1
{
public:
	void a(){}
};

class Class2: public Class1
{
public:
	using Class1::a;
	void a(int i){}
};


int main()
{
	Class2 c2;
	c2.a();

	return  0 ;
}
...
Рейтинг: 0 / 0
31.01.2007, 20:32
    #34297539
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Голенков Владимир А че-й то он скрывает? Ведь унаследованный оператор принимает const int&? Разве так и должно быть?

да, ибо таков стандарт..

Прикольно, а я это как-то забыл совсем... Спасибо что напомнили!
...
Рейтинг: 0 / 0
31.01.2007, 21:18
    #34297584
dasx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Подскажите правильно ли я понял как это всё работает. Собственно как понял я:
Если в классе наследнике перегружается метод базового класса, то автоматически скрывается перегруженый метод с базового класса.
...
Рейтинг: 0 / 0
31.01.2007, 22:43
    #34297677
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Dima_Mihalych пишет:

> Пишет, что в TClass2 отсутствует оператор TClass2::operator = ( const
> int & )
>
> Подскажите как из этой ситуации можно красиво выйти.

operator = не наследуется.

Вот цитата (12.8.10):

Because a copy assignment operator is implicitly declared for a class if not
declared
by the user, a base class copy assignment operator is always hidden by the copy
assignment operator of a derived class
(13.5.3). A using-declaration (7.3.3) that brings in from a base class an
assignment operator with a parameter type
that could be that of a copy-assignment operator for the derived class is not
considered an explicit declaration of a
copy-assignment operator and does not suppress the implicit declaration of the
derived class copy-assignment operator;
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
01.02.2007, 10:01
    #34298171
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
dasxПодскажите правильно ли я понял как это всё работает. Собственно как понял я:
Если в классе наследнике перегружается метод базового класса, то автоматически скрывается перегруженый метод с базового класса.

Да. И надо либо uses, либо явное указание.
...
Рейтинг: 0 / 0
01.02.2007, 12:03
    #34298690
Dima_Mihalych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
Всем спасибо за подробные пояснения. Теперь все ясно!
...
Рейтинг: 0 / 0
01.02.2007, 16:29
    #34299755
A. Fig Lee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перегрузка операторов и наследование
dasxПодскажите правильно ли я понял как это всё работает. Собственно как понял я:
Если в классе наследнике перегружается метод базового класса, то автоматически скрывается перегруженый метод с базового класса.

едак для любого метода класса - как токо переопределил, так родительский и канул в лету.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / перегрузка операторов и наследование / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]