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

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

Восстановить пароль Регистрация
 
andrew20101
0 / 0 / 0
Регистрация: 07.10.2013
Сообщений: 3
07.10.2013, 23:26     Пример из собеседования по C++ #1
Граждане, есть такой пример:
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++ пример
пример в C++ C++
Задача с собеседования (аллокатор памяти) C++
C++ Пример
ООП. Тестовое задание собеседования. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tzeentch
 Аватар для 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
 Аватар для 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++
Ответ Создать тему
Опции темы

Текущее время: 17:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru