Russian Qt Forum
Ноябрь 23, 2024, 15:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: using?  (Прочитано 4608 раз)
CuteBunny
Гость
« : Июль 19, 2012, 09:58 »

Объясните, пожалуйста, следующий момент:

Код
C++ (Qt)
class Parent
{
   public:
       virtual void action( const char how ){ this->action( &how ); }
       virtual void action( const char * how ) = 0;
};
 
class Son : public Parent
{
   public:
       using Parent::action; // Why should i write this line?
       void action( const char * how ){ printf( "Action: %c\n", *how ); }
};
int main( int argc, char** argv )
{
   Son s = Son();
   s.action( 'a' );
   return 0;
}
 

Почему, если закомментировать строку using Parent::action; у класса Son не будет виден метод родительского класса action с const char и программа не скомпилируется?

p.s.: пример нашел на stackoverflow, там есть объяснение, но ни понятнооо
« Последнее редактирование: Июль 19, 2012, 10:01 от CuteBunny » Записан
mutineer
Гость
« Ответ #1 : Июль 19, 2012, 10:12 »

Когда ты определяешь action в наследнике, то происходит перекрытие всех методов action родителя, то есть они становятся не видны из наследника. Чтобы перекрытия не было и нужен using
Записан
CuteBunny
Гость
« Ответ #2 : Июль 19, 2012, 10:15 »

Спасибо
Записан
Akon
Гость
« Ответ #3 : Июль 19, 2012, 11:11 »

Замещение функции в наследнике происходит по имени (а не по сигнатуре). Вот пример, когда это полезно:
Код:
class Parent
{
public:
virtual Parent* clone() const { return new Parent(); }
};

class Son : public Parent
{
public:
// Обратите внимание, возвращается Son* а не Parent*
virtual Son* clone() const { return new Son(); } 
};

...
Son son;
Son* clone = son.clone();  // соответственно, никакого даункаста

Сейчас я не знаю (забыл или не знал вовсе), почему именно такое поведение у компиляторов (замещение по имени, а не по сигнатуре) и сходу найти веское объяснение не получается. Кто подскажет?
Записан
mutineer
Гость
« Ответ #4 : Июль 19, 2012, 11:18 »

Возвращаемое значение не входит в сигнатуру. Потому что просто по вызову someFun(); невозможно определить результат какого типа ты хочешь получить
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 19, 2012, 11:36 »

Замещение функции в наследнике происходит по имени (а не по сигнатуре). Вот пример, когда это полезно:
Сомневаюсь что число таких примеров можно увеличить Улыбающийся Возвращаемый тип должен быть "identical or covariant", это единственное послабление.

Возвращаемое значение не входит в сигнатуру. Потому что просто по вызову someFun(); невозможно определить результат какого типа ты хочешь получить
Не входит но компилятором контролируется. Напр нельзя вернуть int * из Son::Clone
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #6 : Июль 19, 2012, 15:11 »

А почему происходит перекрытие? Ведь Son лишь реализует абстрактный метод
Код:
action( const char *)
, а
Код:
action( const char how )
он наследует от родителя.
Записан
mutineer
Гость
« Ответ #7 : Июль 19, 2012, 15:19 »

В этом и состоит суть перекрытия - если ребенок определяет у себя метод с таким же именем, то родительские методы (с этим же именем) уже недоступны становятся
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #8 : Июль 19, 2012, 15:40 »

Спасибо, теперь понял. Не сразу допёр, что перекрытие не учитывает сигнатуру метода.
Записан
mutineer
Гость
« Ответ #9 : Июль 19, 2012, 15:47 »

Спасибо, теперь понял. Не сразу допёр, что перекрытие не учитывает сигнатуру метода.

Какбе в теме об этом упоминалось
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.139 секунд. Запросов: 23.