class Bank
{
public :
virtual void f(); //просто виртуальная функция в базовом классе
};
class BankOver: public Bank
{
private:
virtual void f(); //в закрытом разделе
};
int main()
{
BankOver b;
Bank * a = &b;
a->f();
}
Что означает __classid?
Наверное, этот вопрос можно было поместить в раздел общего программирования, но второй пункт относиться исключительно к Builder, поэтому все вместе разместила в этом разделе.
1. Допустим есть базовый класс Bank и есть производный от него класс BankOver. В разделе public базового класса Bank есть публичный виртуальный метод View(), такой же метод есть и в производном классе и с такой же сигнатурой и тоже публичный. Значит если написать так: Bank *pointer = & BankOver, то при вызове pointer-> View(), в силу полиморфности будет вызвана ф-ция View() производного класса. Вопрос такой: сработает ли pointer-> View() если в производном классе эта ф-ция расположена в разделе privat или protected, а не в разделе public? Какая ф-ция будет вызвана в таком случае?
2. Что означает слово __classid в Builder?
Спасибо.
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.
Если правильно помню, это аналог дельфёвого class of <type>. По-русски правильно называется метакласс. Ближайший аналог не в VCL - фабрика класса (в т. ч. и COM). Вкупе с виртуальным конструктором TComponent позволяет создавать экземпляр типа, идентификатор которого передается переменной типа __classid. Так работает, в частности, автоматическое создание компонентов на форме при чтении DFM.
Ответ от honeybeer:
>public и protected - сработает, private - не виден нигде, кроме this
Все-таки я не понимаю. Мне кажется, что сработает если метод в производном классе будет даже в privat. Я думаю, при вызове метода через указатель на базовый класс существенен только спецификатор видимости метода в базовом классе, но не в производном, или это не правильно?
К сожалению, временно, нет Builder под рукой, чтобы проверить. :(
Код:
Будет вызван метод f из класса BankOver (я так думаю)?
Правила хорошего тона в ООП не приветствуют понижение видимости метода при перекрытии, а некоторые ЯП запрещают его явно. Кажется, Билдер должен ругнуться в этой ситуации.
А вызываться всегда будет перекрытый метод.
Мне интересно была только теоритеческая часть, для понимания С++, конечно я так делать не собираюсь. :)
Как вы думаете, зачем ввели квалификатор protected?
Его ввели, для того чтобы открыть доступ в производном классе. Мне было интересно узнать, что произойдет, если случайно сделать ошибку и поместить метод в privat. Ответ на свой вопрос получила. Тема закрыта.