Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка метода базового класса. / 17 сообщений из 17, страница 1 из 1
29.10.2007, 16:26:16
    #34902217
Dronord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
Здравствуйте, товарищи!

Возможен ли сабж?

В gcc-3.4.6 и MSVC 2005 Express код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class A
{
public:
	void f() {}
};

class B : public A
{
public:
	void f(int i) {}
};

int main(int argc, char* argv[])
{
	B b;
	static_cast<A>(b).f();  // правильно
	b.f();                          // ошибка
	return  0 ;
}
не компилится. Даже не могу понять почему, может баг компилятора?
В Java это работает =)
...
Рейтинг: 0 / 0
29.10.2007, 16:31:07
    #34902255
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
в B дописать using A::f;
ЗЫ С++ не жаба
...
Рейтинг: 0 / 0
29.10.2007, 16:32:04
    #34902258
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
В С++ перегружаемая функция по умолчанию скрывает все перегружаемые. Попробуй так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class A
{
public:
	void f() {}
};

class B : public A
{
public:
        using f;
	void f(int i) {}
};

int main(int argc, char* argv[])
{
	B b;
	static_cast<A>(b).f();
	b.f();                    
	return  0 ;
}
...
Рейтинг: 0 / 0
29.10.2007, 16:52:11
    #34902360
Dronord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
Спасибо!
Вот это фича...
...
Рейтинг: 0 / 0
29.10.2007, 17:00:34
    #34902407
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
Это не фичаб это в стандарте прописано, иначе возникают проблемы с множественным наследованием
...
Рейтинг: 0 / 0
30.10.2007, 09:15:02
    #34903553
Dronord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
Проблемы возникли, а множественного наследования у меня нет.
...
Рейтинг: 0 / 0
30.10.2007, 11:30:01
    #34903985
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
AkhВ С++ перегружаемая функция по умолчанию скрывает все перегружаемые.
а если их рядом описать?
Код: plaintext
1.
void f() {}
void f(int i) {}
тоже будет видна только последняя?
Или
(2): redefinition of symbol f
(1): symbol f was defined here
...
Рейтинг: 0 / 0
30.10.2007, 11:39:19
    #34904022
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
maXmo AkhВ С++ перегружаемая функция по умолчанию скрывает все перегружаемые.
а если их рядом описать?
Код: plaintext
1.
void f() {}
void f(int i) {}
тоже будет видна только последняя?
Или
(2): redefinition of symbol f
(1): symbol f was defined here

Ну, блин, надо понимать сказанное в контексте примера, то бишь, наследование.
...
Рейтинг: 0 / 0
30.10.2007, 13:57:38
    #34904658
Leshij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
On Tue, 30 Oct 2007 11:30:01 +0300, maXmo <nospam@sql.ru>; wrote:

> Автор: maXmo
> Akh
> В С++ перегружаемая функция по умолчанию скрывает все перегружаемые.
>
> а если их рядом описать?
>
> void f() {}
> void f(int i) {}
> тоже будет видна только последняя?
> Или
> (2): redefinition of symbol f
> (1): symbol f was defined here
> Тема Ответить Сообщение
Это будут две разные функции. В С++ функции различаются не только по
имени, но и по списку аргументов.

--
Здесь у нас туманы и дожди, здесь у нас холодные рассветы,
Здесь на неизведанном пути ждут замысловатые сюжеты!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
30.10.2007, 15:58:47
    #34905090
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
LeshijЭто будут две разные функции. В С++ функции различаются не только по
имени, но и по списку аргументов.
Это и называется перегрузка!!!
...
Рейтинг: 0 / 0
30.10.2007, 16:26:10
    #34905202
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
это называется скрытие. Функция из класса наследника скрывает функцию из базового класса. Очень не рекомендуют так поступать, кстати. Если нужна перегрузка, в базовом классе делаем ф-цию f() виртуальной, и переопределяем её в наследнике, т.е. должно получиться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
public:
	virtual void f() {}
};

class B : public A
{
public:
	void f(int i) {}
        void f() {}
};
...
Рейтинг: 0 / 0
30.10.2007, 16:31:56
    #34905224
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
egorychФункция из класса наследника скрывает функцию из базового класса.раньше так было только если сигнатуры совпадали.
...
Рейтинг: 0 / 0
30.10.2007, 16:33:18
    #34905228
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
название плюс типы параметров.
...
Рейтинг: 0 / 0
30.10.2007, 16:46:04
    #34905285
Dronord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
На деле A::f() мне не надо переопределять. Она использует данные своего класса, в наследнике мне надо использовать именно её, переопределение мне ни к чему. Кроме того, в наследнике мне нужна ещё одна ф-я из базового класса с таким названием, но переопределенная. Она как раз виртуальная:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A
{
public:
	virtual void f(int i) {}
	void f() {}
};
class B : public A
{
public:
	void f(int i) {}
};

egorych , всетаки предлагаете сделать A::f() виртуальной, в потомке её переопределить и вызвать? Чтобы не было путаницы с using:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
public:
	virtual void f(int i) {}
	virtual void f() {}
};
class B : public A
{
public:
	void f(int i) {}
	void f() { A::f(); }
};
...
Рейтинг: 0 / 0
30.10.2007, 16:50:59
    #34905311
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
абсолютно верно, и главное - не будет никаких глюков и косяков :-))
...
Рейтинг: 0 / 0
30.10.2007, 17:00:39
    #34905353
Dronord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
Окей, так и поступлю.
Нет у меня мира с этим скрытием. Зачем оно? Когда один базовый класс, нет никакой неопределенности у компилятора при поиске ф-ии A::f(). Но она появляются у программиста, когда такое случается.
...
Рейтинг: 0 / 0
30.10.2007, 17:24:20
    #34905447
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегрузка метода базового класса.
этот момент хорошо у Мейерса расписан - Effective C++, More Effective C++ очень рекомендую
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка метода базового класса. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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