Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы для интервью 
:(
    Опции темы
mes
Дата 12.11.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Vyacheslav @  12.11.2008,  21:27 Найти цитируемый пост)
Можно ли виртуальный деструктор базового класса объявить чистым? 

объявить можно (не чистым, а абстрактным  smile )
Цитата(Vyacheslav @  12.11.2008,  21:27 Найти цитируемый пост)

И если можно, как сделать, чтобы производные от этого не пострадали?

добавить реализацию .  smile  Нельзя только чтоб "символ чистоты" (=0) и реализация были вместе в объявлении.

Ответный вопрос к  Vyacheslav, является ли нижеупомянутый класс "чисто" абстрактным  и по какой причине ? smile  
Код

class A
{
   public:
      virtual ~A() {}
      virtual  void vf () =0;
      virtual int  f   (int a, int b) { return a+b; }
              int  sum (int a, int b) { return a+b; }
};



Это сообщение отредактировал(а) mes - 12.11.2008, 23:40


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 13.11.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(vinter @  12.11.2008,  22:32 Найти цитируемый пост)
терминалогия идет лесом, если она не критична. В данном случае это именно так, вы на работу программиста берете или буквоеда?

Цитата(Alek86 @  12.11.2008,  22:48 Найти цитируемый пост)
но если испытуемый сыпет умными словами, меня бы это насторожило - возможно предо мною сидит теоретик, взяв которого на работу, рискуешь получить еще одного "идеолога"...

по мне, так ответ в духе "я не понимаю, о чем вы говорите" - приближает соискателя к провалу
при этом, конечно не возбраняется употребление соискателем альтернативных терминов, но только если он сам понимает их значение

Добавлено через 7 минут и 13 секунд
Цитата(mes @  12.11.2008,  23:28 Найти цитируемый пост)
объявить можно (не чистым, а абстрактным

абстрактными бывают классы
а вот чистыми бывают виртуальные функции (pure-virtual)

Цитата(mes @  12.11.2008,  23:28 Найти цитируемый пост)
нижеупомянутый класс "чисто" абстрактным

ну для начала вам надобно ввести определение "чисто" абстрактного класса  smile 


--------------------
user posted image
PM MAIL   Вверх
Vyacheslav
Дата 13.11.2008, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



[
Цитата(J0ker @  12.11.2008,  22:00 Найти цитируемый пост)

не будете
"
1.3.10 signature [defns.signature]
the information about a function that participates in overload resolution (13.3): the types of its parameters
and, if the function is a class member, the cv- qualifiers (if any) on the function itself and the class in which
the member function is declared.2) The signature of a function template specialization includes the types of
its template arguments (14.5.5.1).


Буду.  smile Тип скрытого параметра тут формально тут не причем. В сигнатуру непосредственно включается cv-спецификация функции smile.  Каким конкретно образом она включается -это уже детали.
И формально в классе можно иметь не одну функцию с одним именем и одинаковым списком параметров, а четыре smile
типа

 
Код

class A
{
    void func(int);       // signature:               class: A   +  types:int + fucntion qualifiers:
    void func(int) const; // signature:           class: A    +  types:int + fucntion qualifiers:const
    void func(int) volatile; //signature           class: A   +  types:int + fucntion qualifiers:volatile
    void func(int) const volаtile; //signature  class:A   +  types:int  + fucntion qualifiers:const, volatile
};



Так что вопрос вполне корректен 
А вот ответ на второй вышел несколько натянутым. 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
J0ker
Дата 13.11.2008, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Vyacheslav @  13.11.2008,  02:50 Найти цитируемый пост)
Буду.  smile Тип скрытого параметра тут формально тут не причем. В сигнатуру непосредственно включается cv-спецификация функции smile.  Каким конкретно образом она включается -это уже детали.
И формально в классе можно иметь не одну функцию с одним именем и одинаковым списком параметров, а четыре smile
типа

Цитата(Vyacheslav @  12.11.2008,  21:34 Найти цитируемый пост)
А я не спорю и полностью соглашусь, если в стандарте Вы найдете понятие сигнатуры. 

я вас чесгря не понимаю

Добавлено через 3 минуты
Цитата(Vyacheslav @  13.11.2008,  02:50 Найти цитируемый пост)
Тип скрытого параметра тут формально тут не причем.

он формально причем - константность метода указывает на константность скрытого параметра - иначе это сделать невозможно, т.к. он скрытый
именно поэтому не бывает константных функций не мемберов - там нечему быть константным


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 13.11.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(J0ker @  13.11.2008,  04:43 Найти цитируемый пост)

он формально причем - константность метода указывает на константность скрытого параметра - иначе это сделать невозможно, т.к. он скрытый
именно поэтому не бывает константных функций не мемберов - там нечему быть константным 

ага, вот пример для определения к кому относится cоnst:
Код

struct A;

void test (A * a) {}

struct A 
{
    void myfunc () const { test (this); } // если const  относится не к параметру this, а к методу, то этот код должен компилиться.
};


Это сообщение отредактировал(а) mes - 13.11.2008, 10:25


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 13.11.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(mes @  13.11.2008,  10:23 Найти цитируемый пост)
ага, вот пример для определения к кому относится cоnst:

пример показал только константность this
никто не требует именно передавать this в качестве параметра


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 13.11.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



вы уже 3-ю страницу спорите ни о чем smile, нормальный вопрос Вячеслав задал, если к словам не придераться.


--------------------
Мой блог
PM MAIL WWW   Вверх
Vyacheslav
Дата 13.11.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(J0ker @  13.11.2008,  04:43 Найти цитируемый пост)
он формально причем - константность метода указывает на константность скрытого параметра - иначе это сделать невозможно, т.к. он скрытый
именно поэтому не бывает константных функций не мемберов - там нечему быть константным

Немного наоборот. Он  здесь "причем" фактически, формально  - непричем.  В стандарте прописано, что сигнатуру входит cv-квалификаторы. То что они применимы только к методам класса - это тоже требование
По стандарту 8.5.2 описание декларации функции(неважно какой)  следущее 
 D1 ( parameter-declaration-clause ) cv- qualifier(opt)  exception-specifaction(opt)
 
И я пока не нашел упоминание, что для function members в список параметров входит скрытый  параметр( имеется  в виду с точки зрения терминологии стандарта). Это примерно также, как объяснять  поведение виртуальных функций посредством VMT.
Только проблема в том, что стандарт описывает поведение виртуальных функций, а не VMT.  VMT - это всего лишь конкретная реализация, которая выполнена так, что работа  виртуальных функций отвечала требования стандарта, а не наоборот.
Когда я просил поискать упоминание о сигнатуре( стандарта под рукой  не было) я  предполагал, что там окажется четкая фраза: типа  " в сигнатуру  входит список типов параметров, при этом для функции члена класса в этот список входит тип  "указатель на класс-владелец", модифицированный в соответствии с cv-спецификатором, если он указан" А на самом деле они для разработчиков компиляторов оставили простор для творчества, указав только,что в сигнатуру входит cv спецификаторы.
Если посмотрите 9.3.2 This pointer
то там просто говорится, что в тип this модифицируется в соответствии с cv-спецификатором, если он есть и  нигде не говорится, каким образом pointer попадает  в функцию: через параметры первым параметром, последним или еще как. То есть я в принципе могу разработать компилятор, который параметры будет передавать через стек,  указатель на this через регистр или при вызове методов буду записывать его в   определеному   адресу.
Когда в С++ не было указателя на метод класса Страструп приводил такой пример


 
Код

 
   #include «stream.h»
   struct cl {
                  char* val; 
                  void print(int x) { cout «„ val «« x «« «\n“; }; 
                  cl(char* v) { val = v; };
    };
   // фальшивый'' тип для функций членов: 
   typedef void (*PROC)(void*, int);
   main() 
  { cl z1("z1 "); 
     cl z2("z2 "); 
     PROC pf1 = PROC( &z1.print); 
     PROC pf2 = PROC( &z2.print); z1.print(1); 
     (*pf1)( &z1,2); 
     z2.print(3); (*pf2)( &z2,4); 
  }



Но давал такой комментарий
Цитата

Поэтому в текущей реализации приходится жульничать, используя трюки. Что касается примера, который приводится ниже, то не гарантируется, что он будет работать. Используемый трюк надо локализовать, чтобы программу можно было преобразовать с использованием соответствующей языковой конструкции, когда появится такая возможность. Этот трюк использует тот факт, что в текущей реализации  this реализуется как первый (скрытый) параметр функции члена

С тех времен реализация не изменилась, но , если я не ошибаюсь,  в стандарте требование передачи this первым параметром не застолбили, а следовательно возможны и другие реализации компиляторов.

Добавлено @ 13:11
Цитата(vinter @  13.11.2008,  12:30 Найти цитируемый пост)
ы уже 3-ю страницу спорите ни о чем smile, н 

А  с этим я согласен  smile 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mes
Дата 13.11.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Vyacheslav @  13.11.2008,  13:10 Найти цитируемый пост)
И я пока не нашел упоминание, что для function members в список параметров входит скрытый  параметр(


method(i); это сокращенная запись от (*this).method(i); где this является таким же полноправным параметром как и i. 
запись теоритечески  могла бы выглядить так method(*this).(i); или method(i).(*this); на случай если пугает положение скобок до имени функции.


Цитата(Vyacheslav @  13.11.2008,  13:10 Найти цитируемый пост)
И я пока не нашел упоминание, что для function members в список параметров входит скрытый  параметр

слово "скрытый" к делу не относится - потому что оно действительно относится к способу передачи.
Главное что this является параметром, что ИМХО следует из нижеуказанных абзацев.

Цитата

9.3.1
1 A nonstatic member function may be called for an object of  its  class
  type,  or  for an object of a class derived (_class.derived_) from its
  class  type,  using  the  class  member  access  syntax  ...
5.2.2 ...
Note: a member function call of the form f()
  is  interpreted  as  (*this).f() 



Это сообщение отредактировал(а) mes - 13.11.2008, 16:44


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 13.11.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Vyacheslav, да все это было-бы правильно, если-бы я в первом посте, на который вы задали некорректный вопрос, не упомянул сигнатуру

Добавлено @ 19:06
Цитата(Vyacheslav @  13.11.2008,  13:10 Найти цитируемый пост)
Если посмотрите 9.3.2 This pointer
то там просто говорится, что в тип this модифицируется в соответствии с cv-спецификатором

неправда
он не модифицируется - он "is" - cv-спецификатор в этом случае - это спецификатор this И НИЧЕГО ДРУГОГО!!! он больше ни для чего не нужен! формально, это спецификатор одного из параметров, который не участвует в списке параметров. И это так-же единственная причина, почему тип функции-не-мембера не может использоваться как тип функции-мембера!!!
"
If the member function is declared const, the type of this is const X*, ...
"

Это сообщение отредактировал(а) J0ker - 13.11.2008, 19:13


--------------------
user posted image
PM MAIL   Вверх
Vyacheslav
Дата 13.11.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(J0ker @  13.11.2008,  19:02 Найти цитируемый пост)
Vyacheslav, да все это было-бы правильно, если-бы я в первом посте, на который вы задали некорректный вопрос, не упомянул сигнатуру

При самой первой формулировке   вопроса здесь я процитировал и воспользовался Вашим определением  smile , где  о сигнатуре  ни слова. Я бы не стал жульничать, но в процентах 90 на собеседовании обычно дают именно такой ответ. И следующим моим вопросом обычно является вопрос, как разработчики STL ухитрились в map вставить два метода с одинаковыми именами и списком параметров. 




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
warmonger_
Дата 13.11.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



первая страница форума интересна, потом - не понятно... споры...
давайте еще вопросов)
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
J0ker
Дата 13.11.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Vyacheslav @  13.11.2008,  19:33 Найти цитируемый пост)
При самой первой формулировке   вопроса здесь я процитировал и воспользовался Вашим определением

вы его вырвали из контекста
Цитата(J0ker @  12.11.2008,  19:13 Найти цитируемый пост)
переопределение (overriding) - это создание в классе потомке функции с той-же сигнатурой, что и в классе предке
перегрузка (overloading) - это создание функций с одним именем но разными наборами параметров в одном неймспейсе


единственное к чему тут можно придраться, так это упоминания класса в определении переопределения

Цитата(Vyacheslav @  13.11.2008,  19:33 Найти цитируемый пост)
И следующим моим вопросом обычно является вопрос, как разработчики STL ухитрились в map вставить два метода с одинаковыми именами и списком параметров. 

данный вопрос некорректен - константность функции определяет константность одного из аргументов - каким образом этот аргумент попадает в функцию и как к нему происходит обращение рояля не играет - достаточно того, что аргумент присутствует

Добавлено через 5 минут и 33 секунды
Цитата(warmonger_ @ 13.11.2008,  20:12)
первая страница форума интересна, потом - не понятно... споры...
давайте еще вопросов)

офтопиковый вопрос
определить зацикленность односвязного списка (для начала)


--------------------
user posted image
PM MAIL   Вверх
Vyacheslav
Дата 13.11.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Спор стал бессмысленым
Можно простой вопрос  smile 
Сколько параметров какого типа в методе A::func(int, int)?




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mes
Дата 13.11.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Vyacheslav @  13.11.2008,  21:05 Найти цитируемый пост)
Сколько параметров какого типа в методе A::func(int, int)?

static или обычная ?  
у static два int`а
иначе два int`a и указатель на объект класса А
(чтоб лучше представить: попобуйте вызвать ее, имея указатель на вашу не-статичную функцию и не имея аргументов для упомянутых выше параметров )

Это сообщение отредактировал(а) mes - 13.11.2008, 21:33


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.