Форум программистов, компьютерный форум CyberForum.ru

Виртуальные функции с одинаковым именем и разным набором аргументов - C++

Восстановить пароль Регистрация
 
Нитонисе
7 / 7 / 2
Регистрация: 12.10.2013
Сообщений: 247
05.12.2013, 12:10     Виртуальные функции с одинаковым именем и разным набором аргументов #1
Есть абстрактный базовый класс и пара наследников.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base
{
public:
  vurtual void Func(int a); 
  vurtual void Func(int a, int b);
};
 
class ChildA : public Base
{
public:
  void Func(int a);
}
 
class ChildB : public Base
{
public:
  void Func(int a, int b);
}
Компилятор при такой структуре выдает предупреждения, но компиляция проходит.
W8022 'ChildA::Func(int a)' hides virtual function 'Base::Func(int a, int b)'
W8022 'ChildB::Func(int a, int b)' hides virtual function 'Base::Func(int a)'
Функции дочерних классов прячут виртуальные функции абстрактного базового. Что это означает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 12:10     Виртуальные функции с одинаковым именем и разным набором аргументов
Посмотрите здесь:

C++ две переменные с одинаковым именем
C++ Виртуальные функции
виртуальные функции C++
Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? C++
Виртуальные функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
05.12.2013, 12:43     Виртуальные функции с одинаковым именем и разным набором аргументов #2
Цитата Сообщение от Нитонисе Посмотреть сообщение
Есть абстрактный базовый класс и пара наследников.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base
{
public:
  vurtual void Func(int a); 
  vurtual void Func(int a, int b);
};
 
class ChildA : public Base
{
public:
  void Func(int a);
}
 
class ChildB : public Base
{
public:
  void Func(int a, int b);
}
Компилятор при такой структуре выдает предупреждения, но компиляция проходит.


Функции дочерних классов прячут виртуальные функции абстрактного базового. Что это означает?
Скорее всего у вас выставлены какие то параметры компиляции, что реагирует на это. Но это только предположение.
Нитонисе
7 / 7 / 2
Регистрация: 12.10.2013
Сообщений: 247
05.12.2013, 13:21  [ТС]     Виртуальные функции с одинаковым именем и разным набором аргументов #3
Цитата Сообщение от ShadowFirst Посмотреть сообщение
Скорее всего у вас выставлены какие то параметры компиляции, что реагирует на это. Но это только предположение.
То есть мои классы должны работать нормально без сюрпризов?
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
05.12.2013, 13:35     Виртуальные функции с одинаковым именем и разным набором аргументов #4
Цитата Сообщение от Нитонисе Посмотреть сообщение
Функции дочерних классов прячут виртуальные функции абстрактного базового. Что это означает?
Это означает, что попытка вызвать Func(int,int) для объекта ChildA приведёт к ошибке компиляции.
Нужно будет явно указать Base::Func(). См. пример.
C++
1
2
3
    ChildA a;
    a.Func( 11, 22 );  /* ошибка компиляции  error C2660: ChildA::Func: функция не принимает 2 аргументов */
    a.Base::Func( 11, 22 ); /* ok  */
Нитонисе
7 / 7 / 2
Регистрация: 12.10.2013
Сообщений: 247
05.12.2013, 13:48  [ТС]     Виртуальные функции с одинаковым именем и разным набором аргументов #5
Цитата Сообщение от Alex5 Посмотреть сообщение
Это означает, что попытка вызвать Func(int,int) для объекта ChildA приведёт к ошибке компиляции.
Нужно будет явно указать Base::Func(). См. пример.
А, тогда ясно. Просто для класса ChildA не будет реализации функции с двумя аргументами - она там не нужна. Тогда по идее и ошибок не будет.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.12.2013, 14:39     Виртуальные функции с одинаковым именем и разным набором аргументов #6
Достаточно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class ChildA : public Base
{
public:
  using Base::Func;
  void Func(int a);
}
 
class ChildB : public Base
{
public:
  using Base::Func;
  void Func(int a, int b);
}
Yandex
Объявления
05.12.2013, 14:39     Виртуальные функции с одинаковым именем и разным набором аргументов
Ответ Создать тему
Опции темы

Текущее время: 20:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru