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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос на собеседовании 
:(
    Опции темы
Paspartu
Дата 21.9.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток.

Вот такой вопрос:

23.  Что будет напечатано в результате?

Код

class A
{
    public: virtual void msg () {cout << "classA ";}
};

class B : public A
{
    public: virtual void msg () {cout << "classB ";}
};

void f(A class) 
{
    class.msg();
}

int main() {

    A * pointer = new B;
   pointer ->msg();
    f(*pointer );
}



Ответ:

 c) classB classA

Как правильно обосновать ответ?

пробую так:

т.к. функция msg () является виртуальной в базовом классе A и она переопределена в производном классе B,
 унаследованном от класса A, то решение о том, какая ее версия будет вызвана определяется по типу объекта…
т.к. указатель на базовый класс можно использовать для ссылки на объекты любых других классов, выведенных 
из базового то A * pointer = new B, var – указывает на объект класса B, соответственно pointer->msg() приведет к 
вызову версии msg () для класса B. При вызове f(*pointer) в функции void f(A cl) будет времмено создан объект 
класса A и соответственно class.msg() приведет к вызову msg () для класса A. 

Что Вы думаете по этому поводу?


PM MAIL   Вверх
vinter
Дата 21.9.2008, 14:36 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Paspartu @  21.9.2008,  14:54 Найти цитируемый пост)
Что Вы думаете по этому поводу?

многабукафф.

Цитата(Paspartu @  21.9.2008,  14:54 Найти цитируемый пост)
Как правильно обосновать ответ?

в первом случае будет выведен classB, по принципу полиморфности. Во втором classA т.к обьект передаеться по значению, значит он будет обрезан до родителя smile


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


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Paspartu @  21.9.2008,  17:54 Найти цитируемый пост)

Что Вы думаете по этому поводу?

compile time error в строчке 
Цитата(Paspartu @  21.9.2008,  17:54 Найти цитируемый пост)
void f(A class) 


Добавлено через 26 секунд
даже подсветка хворума показывает что этот код крив.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mes
Дата 21.9.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Mayk @  21.9.2008,  15:43 Найти цитируемый пост)
void f(A class) 

по смыслу название переменной "class" тоже неправильно: как параметр передается объект, а не класс... ;)



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


Шустрый
*


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

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



с class я конечно загнул, аш самому смешно  smile 
в попыхах писал, код кривой, но важна суть...

с принципом полиморфности согласен, а чем обосновать ответ
< Во втором classA т.к обьект передаеться по значению, значит он будет обрезан до родителя >?
Стандарт?
PM MAIL   Вверх
vinter
Дата 21.9.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Paspartu @  21.9.2008,  21:46 Найти цитируемый пост)
Стандарт?

стандарт я не читал ниразу smile А зачем обосновывать? обосновывают решения, а не прописные истины.


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


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


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

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



Цитата(Paspartu @  21.9.2008,  20:46 Найти цитируемый пост)
а чем обосновать ответ< Во втором classA т.к обьект передаеться по значению, значит он будет обрезан до родителя >?

Очень просто, при полиморфном вызове используется указатель на VMT, который устанавливается конструктором.
Т.е надо "посмотреть" чьим конструктором создан объект и станет ясно , какой метод вызовется.
Код

A * pointer = new B; // oбъект создан конструктором класса B

void f(A a)  // передача по значению говорит о том что будет создана копия, используя конструктор класса A
{
 a.msg;   
}

void f1(A* a)  // передача по указателю говорит о том что будет будет использован "оригинал" и зависит от того каким конструктором был создан
{
 a->msg;   
}



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


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


Шустрый
*


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

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



Так, понятно, огромное спасибо!

Вот еще вопрос

дано:

char* str = "12345";

и усе!

перевернуть все символы не используя буфер т.е. получить я так понял указатель на "54321", по google - л, но хочется понять принцип, и как зная только лишь указатель это можно сделать?
PM MAIL   Вверх
MAKCim
Дата 21.9.2008, 21:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



Paspartu, 
никак в такой формулировке


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Paspartu
Дата 21.9.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот и я голову ломаю, с массивом все понятно, а так через указатель?
В любом случае нужен буфер, хотя в задании четко прописано - дополнительный буфер не использовать!?
Во засада! 
PM MAIL   Вверх
vinter
Дата 21.9.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Код

char str[] = "12345";
for(size_t i = 0; i < strlen(str)/2; ++i )
    std::swap( str[i], str[ strlen(str) - 1 - i] );


Paspartu, 
Цитата(Paspartu @  21.9.2008,  22:28 Найти цитируемый пост)
char* str = "12345";

при такой записи вероятно, что нельзя будет сделать, т.к очень часто это воспринимается компилятором как const char*


--------------------
Мой блог
PM MAIL WWW   Вверх
Rpahut
Дата 21.9.2008, 23:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

Репутация: 2
Всего: 7



Цитата

В любом случае нужен буфер

Код

// swap values
// [0]<->[4]
str[0] ^= str[4];
str[4] ^= str[0];
str[0] ^= str[4];
// [1]<->[3]
str[1] ^= str[3];
str[3] ^= str[1];
str[1] ^= str[3];


--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
J0ker
Дата 22.9.2008, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Paspartu @  21.9.2008,  20:46 Найти цитируемый пост)
а чем обосновать ответ
< Во втором classA т.к обьект передаеться по значению, значит он будет обрезан до родителя >?
Стандарт? 

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

Это сообщение отредактировал(а) J0ker - 22.9.2008, 04:03


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 22.9.2008, 03:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Rpahut @ 21.9.2008,  23:52)
Цитата

В любом случае нужен буфер

Код

// swap values
// [0]<->[4]
str[0] ^= str[4];
str[4] ^= str[0];
str[0] ^= str[4];
// [1]<->[3]
str[1] ^= str[3];
str[3] ^= str[1];
str[1] ^= str[3];

как написал vinter это либо не будет компилиться, либо приведет к undefined behavior т.к. по стандарту строковые литералы - константы (2.3.14)


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


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



С указателем никак, а если через буффер, то ещё можно так:
Код
//=============================================================================

#include <stdio.h>
#include <string.h>

//=============================================================================

int main(int argc, char** argv)
{
  char str[] = "12345";
  size_t max = strlen(str);

  for (size_t i = 0; i < max/2; ++i)
  {
    str[i] = str[i] + str[max - (i + 1)];
    str[max - (i + 1)] = str[i] - str[max - (i + 1)];
    str[i] = str[i] - str[max - (i + 1)];
  }

  return 0;
}

//=============================================================================



--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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