Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
andrew20101
0 / 0 / 0
Регистрация: 07.10.2013
Сообщений: 3
#1

Пример из собеседования по C++ - C++

07.10.2013, 23:26. Просмотров 777. Ответов 5
Метки нет (Все метки)

Граждане, есть такой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class B
{
private:
    virtual void f() { std::cout << "B::f()" << std::endl;}
public:
    void g() { std::cout << "B::g()" << std::endl;}
};
 
class D : public B
{
private:
    double g;
public:
    void f() { std::cout << "D::f()" << std::endl;}
};
 
 
int main(int, char**)
{
    D d;
    d.g();
    return 0;
}
Скажите, пожалуйста, почему этот код не компилится? Точнее ошибку компилятора я могу прочитать, но не могу взять в толк какой принцип c++ мешает компиляции кода. Про сокрытие методов понятно, но здесь же идет четкий вызов функции, а не доступ к закрытой переменной. Почему не видит метод g класса B?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2013, 23:26     Пример из собеседования по C++
Посмотрите здесь:

Задания с++ с собеседования - C++
Предложите ваши варианты решения заданий 1. Перечислите все проблемы, которые вы видите в данном коде: class Foo { public: ...

Собеседования по С++ для джуна - C++
Добрый день, если вы бы проводили собеседования по С++ для джуна - какой вопрос по С++ вы бы припасли как самый сложный? Для...

Задание с собеседования (циклы) - C++
День добрый! Был сегодня на собеседовании, и было такое задание где было такое задание: Описать одним предложением что делает данная...

Задача с собеседования (аллокатор памяти) - C++
Вопрос звучит так: &quot;Напишите быстрый аллокатор памяти&quot; Как я его понимаю: можно пожертвовать растратой памяти, всякими наворотами,...

ООП. Тестовое задание собеседования. - C++
Это тестовое задание для устройста на работу. Я не совсем понимаю что от меня хотят. Не могли бы вы мне далее составить набросок плана...

Трудоустройство: что нужно знать для успешного прохождения собеседования в самые крутые компании? - C++
Добрый вечер. Напишите пожалуйста список того, что нужно знать для успешного прохождения собеседования в самые крутые компании, c++...

Не компилируется пример пример! - C++
Добрый день, я только-только решил начать изучать програмирование на С++! Как учебное пособие использую книгу Стефана Р. Девитса &quot;С++ для...

Задача с собеседования - C (СИ)
Всем привет! Недавно был на собеседование. Было много вопросов по строкам. Такое объявление строки я не видел ни разу char *A; и,...

Ищу задачки для собеседования - Java SE
Ищу всякие хитрые и не хитрые задачки, которые могут спрашивать на собеседованиях. Однажды уже был такой опыт, но тогда затупил на простой...

Вопросы с собеседования в nix Solutions. - PHP
Всем привет. Был на днях на себеседовании в nix Solutions. Думал что Я хороший программист, но понял что это нетак. Позадовали мне кучу...

Прохождение собеседования (Системный администратор) - Обо всем!
Добрый день, ув. профессионалы. 1 месяц назад закончил обучение в университете и сейчас занимаюсь поиском работы. Опыта работы, как...

Помощь с прохождением собеседования на знание .Net - C#
Здравствуйте. Нужна помощь госу сего форума :) Как я уже успел убедиться, люди тут очень даже хорошие (особенно &quot;старички&quot; форума). В общем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
07.10.2013, 23:36     Пример из собеседования по C++ #2
Потому что он думает, что g - это член, а не метод.
Вот так будет верно:

C++
1
2
3
4
5
6
int main(int, char**)
{
    D d;
    d.B::g();
    return 0;
}
Здесь мы явно указываем вызвать метод, унаследованный из B.

Не по теме:

А зачем в этом примере f()?

ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
07.10.2013, 23:45     Пример из собеседования по C++ #3
Потому что поле g производного класса перекрывает функцию g базового класса. Даже если поле будет в public, это не скомпилируется, так как функция и поле не могут быть одного имени
andrew20101
0 / 0 / 0
Регистрация: 07.10.2013
Сообщений: 3
08.10.2013, 09:56  [ТС]     Пример из собеседования по C++ #4
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
Потому что поле g производного класса перекрывает функцию g базового класса. Даже если поле будет в public, это не скомпилируется, так как функция и поле не могут быть одного имени
Я считал что перекрытие касается только в плане перекрытие функции базового функцией производного класса, по крайней мере в книжках так написанно.
А если это не перекрытие а считается ошибочным по правилу что не могут быть одного имени то почему без вызова d.g(); компилится прекрасно.
Вообщем непонятно как все-таки до этого доходит компилятор.

Добавлено через 6 минут
Цитата Сообщение от tzeentch Посмотреть сообщение
Потому что он думает, что g - это член, а не метод.
А почему он так думает? Я так понимаю компилятор просматривает область видимости класса D ищет в нем функцию g(), и по моему должен не найти и пойти смотреть в области видимости класса B. почему он выбирает член g если ему указали что нужна функция g()?
tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
08.10.2013, 13:00     Пример из собеседования по C++ #5
Потому что в языке С++ можно описать класс, объекты которого можно вызывать как функции.
Поэтому он сперва пытается получить доступ к члену g, принадлежащему D, чтобы проверить - не функтор ли он, а g у нас private...
Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
class B {
  public:
    void g() {
      std::cout << "Function called!\n";
    }
};
 
class Functor {
  public:
    void operator () () {
      std::cout << "Functor called!\n";
    }
};
 
class D : public B {
  public:
    Functor g;
};
 
 
int main(int, char**) {
  D d;
  d.g();     // Functor call
  d.B::g();  // Function call
  return 0;
}
andrew20101
0 / 0 / 0
Регистрация: 07.10.2013
Сообщений: 3
08.10.2013, 13:36  [ТС]     Пример из собеседования по C++ #6
Цитата Сообщение от tzeentch Посмотреть сообщение
Потому что в языке С++ можно описать класс, объекты которого можно вызывать как функции.
Поэтому он сперва пытается получить доступ к члену g, принадлежащему D, чтобы проверить - не функтор ли он, а g у нас private...
Я прошу прощения за свою дотошность Я знаю про функторы, но мне казалось что компилятор мог бы отделять double и другие встроенные типы от пользовательских.
Спасибо за ответы!
Yandex
Объявления
08.10.2013, 13:36     Пример из собеседования по C++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru