Вопросы для глумления на собеседовании....
От: imh0  
Дата: 15.11.21 14:32
Оценка:
Предлагаю еще тему... ))

И сразу предлагаю свою...

1) Что будет распечатано и почему?...
2) Если убрать комментарии, Что будет распечатано и почему? ...

Жестковато конечно... ) Но зато "есть о чем поговорить" (Ц)...

#include <iostream>
/*
struct c2
{
    c2(         ){printf("%s\n"   ,__PRETTY_FUNCTION__); };
    c2(int i    ){printf("%s %d\n",__PRETTY_FUNCTION__, i);};
    c2(double d ){printf("%s %f\n",__PRETTY_FUNCTION__,d);};
};
*/
struct c3
{
    c3(         ){printf("%s\n"   ,__PRETTY_FUNCTION__); };
    c3(int i    ){printf("%s %d\n",__PRETTY_FUNCTION__, i);};
    c3(double d ){printf("%s %f\n",__PRETTY_FUNCTION__,d);};
};

struct c4: virtual c3
{
    c4(         ):c3(2.4)
                 {printf("%s\n",__PRETTY_FUNCTION__);}
};

struct c5: virtual c4//, virtual c2
{
    c5(         ){printf("%s\n",__PRETTY_FUNCTION__);}
};

int main(int argc, char **argv) 
{
    c5 v1;
    return 0;
}
Re: Вопросы для глумления на собеседовании....
От: kov_serg Россия  
Дата: 15.11.21 15:24
Оценка:
Здравствуйте, imh0, Вы писали:
I>Жестковато конечно... ) Но зато "есть о чем поговорить" (Ц)...
Так и пишите явно что вы хотите, виртуальное же наследование.
struct c5: virtual c4//, virtual c2
{
    c5(         ) : c3(3.14) {printf("%s\n",__PRETTY_FUNCTION__);}
};
Re: Вопросы для глумления на собеседовании....
От: Zhendos  
Дата: 15.11.21 15:48
Оценка: 2 (1) +1 :)
Здравствуйте, imh0, Вы писали:

I>Предлагаю еще тему... ))


I>И сразу предлагаю свою...

I>Вопросы для глумления на собеседовании....

Лучше использовать недавние нашумевшие невидимые символы (https://certitude.consulting/blog/en/invisible-backdoor/),
и демонстрировать собеседнику код на ноутбуке,
спрашивать что он напечатает, а потом показывать как он ошибался
и спрашивать в чем же дело, но доступа к клавиатуре не давать.
Типа такого:

#include <cstdio>

void f(int ㅤ) {
    printf("%d\n", ㅤ);
}
int main(int argc, char **argv) 
{
   f(17);
}
Re[2]: Вопросы для глумления на собеседовании....
От: imh0  
Дата: 16.11.21 10:17
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Так и пишите явно что вы хотите, виртуальное же наследование.


Ты о чем? Не очень понял. Но тем не менее, хоть бы ты ответил на поставленные вопросы, а то походу мало кто понял о чем речь. ))
Re: Вопросы для глумления на собеседовании....
От: B0FEE664  
Дата: 16.11.21 10:21
Оценка:
Здравствуйте, imh0, Вы писали:

I>1) Что будет распечатано и почему?...

__PRETTY_FUNCTION__ — нестандартный макрос идентификатор из зарезервированного множества. Возможно, что код не скомпилируется, в любом случае вывод зависит от компилятора.
И каждый день — без права на ошибку...
Отредактировано 16.11.2021 10:22 B0FEE664 . Предыдущая версия .
Re[2]: Вопросы для глумления на собеседовании....
От: imh0  
Дата: 16.11.21 10:23
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>__PRETTY_FUNCTION__ — нестандартный макрос идентификатор из зарезервированного множества. Возможно, что код не скомпилируется, в любом случае вывод зависит от компилятора.


Ну есть же аналог...

https://social.msdn.microsoft.com/Forums/vstudio/en-US/02c69018-a182-48b3-94d1-250252aa00a7/prettyfunction?forum=vclanguage
Re[3]: Вопросы для глумления на собеседовании....
От: B0FEE664  
Дата: 16.11.21 11:14
Оценка:
Здравствуйте, imh0, Вы писали:

BFE>>__PRETTY_FUNCTION__ — нестандартный макрос идентификатор из зарезервированного множества. Возможно, что код не скомпилируется, в любом случае вывод зависит от компилятора.

I>Ну есть же аналог...
I>https://social.msdn.microsoft.com/Forums/vstudio/en-US/02c69018-a182-48b3-94d1-250252aa00a7/prettyfunction?forum=vclanguage

Зачем нужны аналоги, есть есть стандартная предопределённая константная переменная __func__ ?

тут
И каждый день — без права на ошибку...
Re[3]: Вопросы для глумления на собеседовании....
От: B0FEE664  
Дата: 17.11.21 10:50
Оценка:
Здравствуйте, imh0, Вы писали:

_>>Так и пишите явно что вы хотите, виртуальное же наследование.

I>Ты о чем? Не очень понял. Но тем не менее, хоть бы ты ответил на поставленные вопросы, а то походу мало кто понял о чем речь. ))

Виртуальное базирование — это как умение охотится на огнедышащих драконов: в теории интересно, а на практике не нужно.
Вот, кстати, вопрос из той же категории: зачем может понадобится следующая конструкция:

class A;

class A_lock {
  friend class A;
private:
  A_lock() {}
  A_lock(const A_lock&) {}
};

class A : public virtual A_lock {
  // ...
public:
  A();
  A(char*);
  // ...
};
И каждый день — без права на ошибку...
Re[4]: Вопросы для глумления на собеседовании....
От: night beast СССР  
Дата: 17.11.21 11:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Виртуальное базирование — это как умение охотится на огнедышащих драконов: в теории интересно, а на практике не нужно.


а на практике с плюсах нет интерфейсов, и приходится использовать виртуальное наследование
Re: Вопросы для глумления на собеседовании....
От: Skorodum Россия  
Дата: 17.11.21 12:21
Оценка:
Здравствуйте, imh0, Вы писали:

I>1) Что будет распечатано и почему?...

Ничего. Из-за __PRETTY_FUNCTION__ не скомпилируется
msvc
Re[3]: Вопросы для глумления на собеседовании....
От: kov_serg Россия  
Дата: 17.11.21 12:55
Оценка:
Здравствуйте, imh0, Вы писали:

_>>Так и пишите явно что вы хотите, виртуальное же наследование.

I>Ты о чем? Не очень понял. Но тем не менее, хоть бы ты ответил на поставленные вопросы, а то походу мало кто понял о чем речь. ))
Чего не понятного? Тут виртуальное наследование и классам передают готового родителя, а не класс его создаёт. Так что вы можете явно указать кого хотите подсунуть.
#include <iostream>

struct c2
{
    c2(         ){printf("%s\n"   ,__PRETTY_FUNCTION__); };
    c2(int i    ){printf("%s %d\n",__PRETTY_FUNCTION__, i);};
    c2(double d ){printf("%s %f\n",__PRETTY_FUNCTION__,d);};
};

struct c3
{
    c3(         ){printf("%s\n"   ,__PRETTY_FUNCTION__); };
    c3(int i    ){printf("%s %d\n",__PRETTY_FUNCTION__, i);};
    c3(double d ){printf("%s %f\n",__PRETTY_FUNCTION__,d);};
};

struct c4: virtual c3
{
    c4(         ):c3(2.4)
                 {printf("%s\n",__PRETTY_FUNCTION__);}
};

struct c5: virtual c4, virtual c2
{
    c5(         ) : c3(3.14), c2(2.71) {printf("%s\n",__PRETTY_FUNCTION__);}
};

int main(int argc, char **argv)
{
    c5 v1;
    return 0;
}

output:
c3::c3(double) 3.140000
c4::c4()
c2::c2(double) 2.710000
c5::c5()
Re: вариант
От: B0FEE664  
Дата: 17.11.21 14:55
Оценка:
Здравствуйте, imh0, Вы писали:

I>1) Что будет распечатано и почему?...

I>2) Если убрать комментарии, Что будет распечатано и почему? ...
Те же вопросы:

#include <iostream>
#include <stdio.h>
     
template<class T>
T x = T{};

//template<int N>
void f()
{
  class Test
  {
      public:
        Test()
        {
            PrintN(123);
        } 
        
        void PrintN(int n)
        {
            printf("%d ", n);
        }
  };

  Test t = x<Test>;
  t.PrintN(345);
}


int main()
{
  std::cout << "hello world\n";
  return 0;
}
И каждый день — без права на ошибку...
Re[5]: Вопросы для глумления на собеседовании....
От: fdn721  
Дата: 18.11.21 03:17
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, B0FEE664, Вы писали:


BFE>>Виртуальное базирование — это как умение охотится на огнедышащих драконов: в теории интересно, а на практике не нужно.


NB>а на практике с плюсах нет интерфейсов, и приходится использовать виртуальное наследование


Зачем?
Re[6]: Вопросы для глумления на собеседовании....
От: night beast СССР  
Дата: 18.11.21 06:27
Оценка:
Здравствуйте, fdn721, Вы писали:

BFE>>>Виртуальное базирование — это как умение охотится на огнедышащих драконов: в теории интересно, а на практике не нужно.


NB>>а на практике с плюсах нет интерфейсов, и приходится использовать виртуальное наследование


F>Зачем?


зачем интерфейсы или зачем виртуальное наследование?
Отредактировано 18.11.2021 6:52 night beast . Предыдущая версия .
Re[4]: Вопросы для глумления на собеседовании....
От: Максим Россия  
Дата: 18.11.21 06:28
Оценка:
BFE>Вот, кстати, вопрос из той же категории: зачем может понадобится следующая конструкция:

Об этом не написано даже в рубрике "Strange Inheritance — What your mother never told you" https://isocpp.org/wiki/faq/strange-inheritance
Это точно законно ?

П.С.
Расскажите, пожалуйста, про задачи в которых такие конструкции возникают.
Errare humanum est
Re[7]: Вопросы для глумления на собеседовании....
От: Максим Россия  
Дата: 18.11.21 06:42
Оценка:
NB>зачем интерфейсы ли зачем виртуальное наследование?

Да, раз мы уже заговорили про наследование, кто-нибудь знает ситуации в которых полезно private наследование? Я видел только примеры такого наследования для классов с методами (без данных), которые будут занимать лишнее место если их аггрегировать (по стандарту объект не может иметь размер 0 байт). При закрытом же наследовании лишнее место не используется и в тоже время мы не экспортим лишний интерфейс. Но с появление namespcace-ов непонятно зачем такие сложности.

П.С.
А "виртуальное базирование" это какой-то уже устоявшийся термин? Не нашел английское соответствие для него.
Errare humanum est
Re[8]: Вопросы для глумления на собеседовании....
От: night beast СССР  
Дата: 18.11.21 07:23
Оценка: :)
Здравствуйте, Максим, Вы писали:

М>Да, раз мы уже заговорили про наследование, кто-нибудь знает ситуации в которых полезно private наследование? Я видел только примеры такого наследования для классов с методами (без данных), которые будут занимать лишнее место если их аггрегировать (по стандарту объект не может иметь размер 0 байт). При закрытом же наследовании лишнее место не используется и в тоже время мы не экспортим лишний интерфейс. Но с появление namespcace-ов непонятно зачем такие сложности.


так сходу и не скажу.
не сходу тоже
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.