powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка метода базового класса.
17 сообщений из 17, страница 1 из 1
Перегрузка метода базового класса.
    #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
Перегрузка метода базового класса.
    #34902255
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в B дописать using A::f;
ЗЫ С++ не жаба
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34902258
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
Перегрузка метода базового класса.
    #34902360
Dronord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Вот это фича...
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34902407
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не фичаб это в стандарте прописано, иначе возникают проблемы с множественным наследованием
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34903553
Dronord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблемы возникли, а множественного наследования у меня нет.
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34903985
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВ С++ перегружаемая функция по умолчанию скрывает все перегружаемые.
а если их рядом описать?
Код: plaintext
1.
void f() {}
void f(int i) {}
тоже будет видна только последняя?
Или
(2): redefinition of symbol f
(1): symbol f was defined here
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34904022
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo AkhВ С++ перегружаемая функция по умолчанию скрывает все перегружаемые.
а если их рядом описать?
Код: plaintext
1.
void f() {}
void f(int i) {}
тоже будет видна только последняя?
Или
(2): redefinition of symbol f
(1): symbol f was defined here

Ну, блин, надо понимать сказанное в контексте примера, то бишь, наследование.
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #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
Перегрузка метода базового класса.
    #34905090
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeshijЭто будут две разные функции. В С++ функции различаются не только по
имени, но и по списку аргументов.
Это и называется перегрузка!!!
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #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
Перегрузка метода базового класса.
    #34905224
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychФункция из класса наследника скрывает функцию из базового класса.раньше так было только если сигнатуры совпадали.
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34905228
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
название плюс типы параметров.
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #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
Перегрузка метода базового класса.
    #34905311
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
абсолютно верно, и главное - не будет никаких глюков и косяков :-))
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34905353
Dronord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Окей, так и поступлю.
Нет у меня мира с этим скрытием. Зачем оно? Когда один базовый класс, нет никакой неопределенности у компилятора при поиске ф-ии A::f(). Но она появляются у программиста, когда такое случается.
...
Рейтинг: 0 / 0
Перегрузка метода базового класса.
    #34905447
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот момент хорошо у Мейерса расписан - Effective C++, More Effective C++ очень рекомендую
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка метода базового класса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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