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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Нитонисе
8 / 8 / 2
Регистрация: 12.10.2013
Сообщений: 247
#1

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

05.12.2013, 12:10. Просмотров 692. Ответов 5
Метки нет (Все метки)

Есть абстрактный базовый класс и пара наследников.
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++):

GCC компилируе с разным набором параметров - C++
Всем привет! Нашел в интернете курс для новичков по C++. В нем предлагается изучать его используя компилятор GCC, чтобы прочувствовать...

две переменные с одинаковым именем - C++
Вопрос скорее теоретический: Использую Visual C++ , запускаю debug и в окошечке переменных вижу, например, две переменные с именем i....

Задание нескольких #region с одинаковым именем. Нормально ли это? - C++
Могу ли я указывать несколько #region с одинаковыми именами в рамках одного файла или в рамках некоторого проекта. Не противоречит ли это...

Инициализация переменных с разным именем в цикле - C++
Добрый день, по сути весь вопрос написан в заголовке, нужно с каждой итерацией создавать новую переменную

виртуальные и чисто виртуальные функции - C++
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include <iostream> using...

Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)? - C++
Я конечно, понимаю, что на такие вопросы отвечают "почитай книжку". Я читала, честное слово:) Конкретно. Есть функция void jacobi (...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ShadowFirst
55 / 48 / 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);
}
Компилятор при такой структуре выдает предупреждения, но компиляция проходит.


Функции дочерних классов прячут виртуальные функции абстрактного базового. Что это означает?
Скорее всего у вас выставлены какие то параметры компиляции, что реагирует на это. Но это только предположение.
Нитонисе
8 / 8 / 2
Регистрация: 12.10.2013
Сообщений: 247
05.12.2013, 13:21  [ТС] #3
Цитата Сообщение от ShadowFirst Посмотреть сообщение
Скорее всего у вас выставлены какие то параметры компиляции, что реагирует на это. Но это только предположение.
То есть мои классы должны работать нормально без сюрпризов?
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
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  */
Нитонисе
8 / 8 / 2
Регистрация: 12.10.2013
Сообщений: 247
05.12.2013, 13:48  [ТС] #5
Цитата Сообщение от Alex5 Посмотреть сообщение
Это означает, что попытка вызвать Func(int,int) для объекта ChildA приведёт к ошибке компиляции.
Нужно будет явно указать Base::Func(). См. пример.
А, тогда ясно. Просто для класса ChildA не будет реализации функции с двумя аргументами - она там не нужна. Тогда по идее и ошибок не будет.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 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);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 14:39
Привет! Вот еще темы с ответами:

Составить программу для решения ребуса : КОТ + КОТ = ТОК, где разным буквам соответствуют разные цифры, одинаковым - одинаковые - C++
Составить программу для решения ребуса : КОТ + КОТ = ТОК, где разным буквам соответствуют разные цифры, одинаковым - одинаковые. Заранее...

виртуальные функции - C++
Добрый день. Начал изучать виртуальные функции и столкнулся с проблемой. Не могу перегрузить функцию. Объясните что не так и как нужно: ...

Виртуальные функции - C++
Здрасте! вот задачка, какбэ сделал, но нужны виртуальные функции. даже не знаю как их сделать. #include <iostream.h> #include...

Виртуальные функции - C++
Составить программу в С Buildere. Объявить базовый класс с именем person {имя, возраст, группа}. Определить функцию show (), которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.12.2013, 14:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru