Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6

Изменение области видимости функции

24.04.2014, 17:06. Показов 4274. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, имеется вопрос по наследованию:
Пусть имеется некоторый класс A c функцией func
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
 class A 
{
  ...
  Public:
  int func();
  ...
}
И наследуемый от него класс B
class B: public A
{
...
}
Можно ли скрыть данную функцию от внешнего вызова, но оставить её в наследуемом классе( т.е сделать так, чтобы в наследуемом классе данная функция была private ) ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2014, 17:06
Ответы с готовыми решениями:

Изменение области видимости данных(Что? Где? Когда?)
Здравствуйте, ребята. Мне нужно расписать об изменении области видимости данных. А я даже не представляю как это делается, в инете инфу...

Области видимости
Если я запихиваю любые операции (в данном случае задание и заполнение массива); То далее не видит, не то что не заполненный массив, а...

Области видимости функций
Добрый день. Написал класс, помогите найти ошибки #include <iostream> #include <string> #include <vector> using...

18
Заблокирован
24.04.2014, 17:21
Цитата Сообщение от dmonkoff Посмотреть сообщение
Можно ли скрыть данную функцию от внешнего вызова
скрыть от внешнего вызова в каком классе, А или B ?
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:22  [ТС]
в B
0
Заблокирован
24.04.2014, 17:29
Цитата Сообщение от dmonkoff Посмотреть сообщение
но оставить её в наследуемом классе
что значит оставить? Её там нет - добавь и будет. Если хочешь чтоб базовый тебя обязывал её реализовывать - сделай её в базовом чисто вирутальной

Добавлено через 33 секунды
Цитата Сообщение от dmonkoff Посмотреть сообщение
в B
ну напиши эту функцию в B как private, что мешает то )))

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 class A 
{
  ...
  Public:
  int func();
  ...
}
И наследуемый от него класс B
class B: public A
{
     private:
     int func();
}
что - то не так?
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:38  [ТС]
newbie666

Реализация при этом будет реализацией базового класса, или функция при таком объявлении перегружается и нужно переопределять её в дочернем классе?
0
Заблокирован
24.04.2014, 17:44
Цитата Сообщение от dmonkoff Посмотреть сообщение
Реализация при этом будет реализацией базового класса, или функция при таком объявлении перегружается и нужно переопределять её в дочернем классе?
ничего из выше перечисленного, если хочешь иметь реализацию базового класса, просто не объявляй функцию в дочернем
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.04.2014, 17:48
Можно ж и так написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A {
public:
   void foo() const { std::cout << "A::foo()"; }
};
 
class B : public A {
   void foo() const { A::foo(); }
public:
   void f() const { foo(); std::cout << ", f()\n"; }
};
 
int main()
{
   B b;
   b.f();
   //b.foo();
 
   return 0;
}
0
Заблокирован
24.04.2014, 17:50
Если ты хочешь сделать так, чтоб функция из базового класса присутствовала в дочернем с реализацией базового, при этом в базовом она Public, а в дочернем ты хочешь её сделать private - нет ничего проще - делай private наследование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A 
{   
public:
    A(){};
    ~A(){};
    int func()
    {
        int x = 3;
    };  
};
 
class B : private A
{
public:
    B(){};
    ~B(){};
};
Добавлено через 1 минуту
Цитата Сообщение от DiffEreD Посмотреть сообщение
Можно ж и так написать:
нельзя - тк в базовом классе будет к функции доступ, а как я предложил - верно
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:52  [ТС]
Цитата Сообщение от newbie666 Посмотреть сообщение
ничего из выше перечисленного, если хочешь иметь реализацию базового класса, просто не объявляй функцию в дочернем
Ну дык мне реализация нужна базового класса, но при этом чтобы сам метод стал private)
Ладно, мне удалось что то скомпилировать и оно работает, вопрос насколько правильно так писать:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
  public:
  func();
...
}
 
class B: public A
{
  private:
  func();
  public:
  funcShell()
}
 
void B::funcShell()
{
  A::func();
  /*некоторые дополнительные действия после того как выполнилась функция func*/
}
0
Заблокирован
24.04.2014, 17:54
Цитата Сообщение от newbie666 Посмотреть сообщение
нельзя - тк в базовом классе будет к функции доступ,
точнее доступа не будет, т.к. она в дочернем классе - private, но если к ней сделать доступ пабликом - эту функция будет дочернего класса, а ТС хотел так - как я написал уже

Добавлено через 52 секунды
Цитата Сообщение от dmonkoff Посмотреть сообщение
Ну дык
дык решение я тебе уже в 8-м посту настрочил

Добавлено через 1 минуту
Цитата Сообщение от dmonkoff Посмотреть сообщение
вопрос насколько правильно так писать:
такое пишут при ромбическом наследование - тут это совсем не уместно
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 18:05  [ТС]
Цитата Сообщение от newbie666 Посмотреть сообщение
точнее доступа не будет, т.к. она в дочернем классе - private, но если к ней сделать доступ пабликом - эту функция будет дочернего класса, а ТС хотел так - как я написал уже

Добавлено через 52 секунды

дык решение я тебе уже в 8-м посту настрочил

Добавлено через 1 минуту

такое пишут при ромбическом наследование - тут это совсем не уместно
Т.е надо реализовывать через виртуальные функции?
Просто сейчас да, я могу объявить функцию func виртуальной в A и в B написать уже новую реализацию, но здесь я функцию func писал сам и дописать её в новом классе- не проблема.
Но что если класс A писал вася пупкин неизвестно как и неизвестно когда, и мне надо написать вот такую оболочку для функции.
Лезть в исходники и разбираться или просто есть более изящный способ того, что я сделал?
0
Заблокирован
24.04.2014, 18:09
Цитата Сообщение от dmonkoff Посмотреть сообщение
Но что если класс A писал вася пупкин неизвестно как и неизвестно когда, и мне надо написать вот такую оболочку для функции
какую в хрену оболочку? Я ж вроде по русский написал, если ты хочешь, чтоб в дочернем классе у тебя присутствовала функция (со всем своим функционалом ) из базового класса и в то же время, эта функция была закрыта в дочернем классе, то делай наследование от класса A в виде private, как я тебе показал, в дочернем классе её реализовывать уже не надо. Если же ты хочешь "дописать" как то функционал уже готовой функции в дочернем классе, то это не возможно, в C# есть partial классы, но они только для дописывания нового функционала к уже существующему базового, а чтоб дописать функцию - такого нет.
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 19:11  [ТС]
Цитата Сообщение от newbie666 Посмотреть сообщение
какую в хрену оболочку? Я ж вроде по русский написал, если ты хочешь, чтоб в дочернем классе у тебя присутствовала функция (со всем своим функционалом ) из базового класса и в то же время, эта функция была закрыта в дочернем классе, то делай наследование от класса A в виде private, как я тебе показал, в дочернем классе её реализовывать уже не надо. Если же ты хочешь "дописать" как то функционал уже готовой функции в дочернем классе, то это не возможно, в C# есть partial классы, но они только для дописывания нового функционала к уже существующему базового, а чтоб дописать функцию - такого нет.
Ладно, будем думать.
Невозможность дописывать функционал меня расстраивает.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
24.04.2014, 20:21
Цитата Сообщение от dmonkoff Посмотреть сообщение
Можно ли скрыть данную функцию от внешнего вызова, но оставить её в наследуемом классе( т.е сделать так, чтобы в наследуемом классе данная функция была private )
C++
1
2
3
4
5
6
7
8
9
10
11
class A 
{
public:
  int func();
}
 
class B : public A
{
private:
    using A::func;
}
1
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
30.03.2015, 00:09
DrOffset,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
public:
    virtual void Foo() { cout << "Test"; }
};
 
class B : public A
{
    using A::Foo;
};
 
int main()
{
    A *a;
    a = new B();
    a->Foo();
    return 0;
}
Почему это будет работать?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
30.03.2015, 00:16
Цитата Сообщение от xEmpire Посмотреть сообщение
Почему это будет работать?
А почему не должно? Везде в этом коде ты работаешь с объектом через указатель на А. В классе А функция открыта, поэтому это работает.
0
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
30.03.2015, 00:21
DrOffset,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
public:
    virtual void Foo() { cout << "Test"; }
};
 
class B : public A
{
    void Foo() { A::Foo(); }
};
 
int main()
{
    A *a;
    a = new B();
    a->Foo();
    return 0;
}
Таким образом ф-ия базового класса почему-то не перекрывается. И по непонятным для меня причинам полиморфный метод Foo всё ещё доступен. Если бы не было спецификатора virtual, я бы это понял. Что я упустил?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
30.03.2015, 00:28
Цитата Сообщение от xEmpire Посмотреть сообщение
Таким образом ф-ия базового класса почему-то не перекрывается.
Как это не перекрывается? Ты же сам определил реализацию функции в наследнике так, что она только и делает, что вызывает функцию базового класса.
Цитата Сообщение от xEmpire Посмотреть сообщение
a->Foo();
В данном коде компилятор исходит из фактического типа указателя. Фактический тип говорит нам, что метод доступен. Поэтому и вызов возможен.
1
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
30.03.2015, 00:28
анализ видимости функции происходит на основе статического типа.
в вашем случае статический тип - указатель на A. т.к. в классе А функция
публичная - этот код компилируется. то, что динамический объект B (а
указывает на объект типа B) в данном случае не имеет значения.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2015, 00:28
Помогаю со студенческими работами здесь

Вопрос об области видимости переменной
У меня в проге один главный цикл и в этом цикле еще 4 цикла. Так вот, в начале главного цикла я написал int i =0; Вопрос, этот i = 0 будет...

Какие есть области видимости в C++?
Добрый день. Что влияет на видимость идентификаторов в коде? Пока мне удалось найти информацию о видимости: членов класса:...

Классы, наследование, области видимости
A.h: #ifndef A_H #define A_H #include &quot;C.h&quot; class C; class A { private:

Инициализация вне области видимости
Здравствуйте! Работаю над деревом, в котором есть две структуры: struct file { public: string name; //имя string...

Оператор разрешения области видимости
Только начинаю изучать ООП. Объясните где и как применяется оператор разрешения области видимости.


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru