Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Что означает __classid?

343
15 июня 2006 года
lena_ki
282 / / 14.04.2005
Привествую мой любимый форум (тут самые умные мужчины)! :)
Наверное, этот вопрос можно было поместить в раздел общего программирования, но второй пункт относиться исключительно к Builder, поэтому все вместе разместила в этом разделе.
1. Допустим есть базовый класс Bank и есть производный от него класс BankOver. В разделе public базового класса Bank есть публичный виртуальный метод View(), такой же метод есть и в производном классе и с такой же сигнатурой и тоже публичный. Значит если написать так: Bank *pointer = & BankOver, то при вызове pointer-> View(), в силу полиморфности будет вызвана ф-ция View() производного класса. Вопрос такой: сработает ли pointer-> View() если в производном классе эта ф-ция расположена в разделе privat или protected, а не в разделе public? Какая ф-ция будет вызвана в таком случае?
2. Что означает слово __classid в Builder?
Спасибо.
585
15 июня 2006 года
honeybeer
297 / / 06.09.2004
1.) public и protected - сработает, private - не виден нигде, кроме this
2.) вот что об этом думет F1
Цитата:
The __classid operator was added to support the VCL framework. Normally, programmers should not directly use this operator. For more information, see the keyword extensions.

10
15 июня 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=lena_ki]2. Что означает слово __classid в Builder?[/QUOTE]
Если правильно помню, это аналог дельфёвого class of <type>. По-русски правильно называется метакласс. Ближайший аналог не в VCL - фабрика класса (в т. ч. и COM). Вкупе с виртуальным конструктором TComponent позволяет создавать экземпляр типа, идентификатор которого передается переменной типа __classid. Так работает, в частности, автоматическое создание компонентов на форме при чтении DFM.
343
15 июня 2006 года
lena_ki
282 / / 14.04.2005
>Вопрос такой: сработает ли pointer-> View() если в производном классе эта ф-ция расположена в разделе privat или protected, а не в разделе public? Какая ф-ция будет вызвана в таком случае?

Ответ от honeybeer:
>public и protected - сработает, private - не виден нигде, кроме this

Все-таки я не понимаю. Мне кажется, что сработает если метод в производном классе будет даже в privat. Я думаю, при вызове метода через указатель на базовый класс существенен только спецификатор видимости метода в базовом классе, но не в производном, или это не правильно?

К сожалению, временно, нет Builder под рукой, чтобы проверить. :(

Код:
class Bank
   {
   public :
      virtual void f(); //просто виртуальная функция в базовом классе

   };

class BankOver: public Bank  
 {
   private:
      virtual void f(); //в закрытом разделе
 };


int main()
   {
   BankOver b;
   Bank * a = &b;
   a->f();
   }


Будет вызван метод f из класса BankOver (я так думаю)?
10
15 июня 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=lena_ki]Все-таки я не понимаю. Мне кажется, что сработает если метод в производном классе будет даже в privat. Я думаю, при вызове метода через указатель на базовый класс существенен только спецификатор видимости метода в базовом классе, но не в производном, или это не правильно?[/QUOTE]
Правила хорошего тона в ООП не приветствуют понижение видимости метода при перекрытии, а некоторые ЯП запрещают его явно. Кажется, Билдер должен ругнуться в этой ситуации.

А вызываться всегда будет перекрытый метод.
343
15 июня 2006 года
lena_ki
282 / / 14.04.2005
[QUOTE=Freeman]Правила хорошего тона в ООП не приветствуют понижение видимости метода при перекрытии[/QUOTE]

Мне интересно была только теоритеческая часть, для понимания С++, конечно я так делать не собираюсь. :)
585
16 июня 2006 года
honeybeer
297 / / 06.09.2004
[QUOTE=lena_ki]Мне интересно была только теоритеческая часть, для понимания С++, конечно я так делать не собираюсь. :)[/QUOTE]
Как вы думаете, зачем ввели квалификатор protected?
343
16 июня 2006 года
lena_ki
282 / / 14.04.2005
[QUOTE=honeybeer]Как вы думаете, зачем ввели квалификатор protected?[/QUOTE]

Его ввели, для того чтобы открыть доступ в производном классе. Мне было интересно узнать, что произойдет, если случайно сделать ошибку и поместить метод в privat. Ответ на свой вопрос получила. Тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог