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

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

Восстановить пароль Регистрация
 
dmonkoff
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:06     Изменение области видимости функции #1
Здравствуйте, имеется вопрос по наследованию:
Пусть имеется некоторый класс 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 ) ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
24.04.2014, 17:21     Изменение области видимости функции #2
Цитата Сообщение от dmonkoff Посмотреть сообщение
Можно ли скрыть данную функцию от внешнего вызова
скрыть от внешнего вызова в каком классе, А или B ?
dmonkoff
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:22  [ТС]     Изменение области видимости функции #3
в B
newbie666
Заблокирован
24.04.2014, 17:29     Изменение области видимости функции #4
Цитата Сообщение от 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();
}
что - то не так?
dmonkoff
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:38  [ТС]     Изменение области видимости функции #5
newbie666

Реализация при этом будет реализацией базового класса, или функция при таком объявлении перегружается и нужно переопределять её в дочернем классе?
newbie666
Заблокирован
24.04.2014, 17:44     Изменение области видимости функции #6
Цитата Сообщение от dmonkoff Посмотреть сообщение
Реализация при этом будет реализацией базового класса, или функция при таком объявлении перегружается и нужно переопределять её в дочернем классе?
ничего из выше перечисленного, если хочешь иметь реализацию базового класса, просто не объявляй функцию в дочернем
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.04.2014, 17:48     Изменение области видимости функции #7
Можно ж и так написать:
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;
}
newbie666
Заблокирован
24.04.2014, 17:50     Изменение области видимости функции #8
Если ты хочешь сделать так, чтоб функция из базового класса присутствовала в дочернем с реализацией базового, при этом в базовом она 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 Посмотреть сообщение
Можно ж и так написать:
нельзя - тк в базовом классе будет к функции доступ, а как я предложил - верно
dmonkoff
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:52  [ТС]     Изменение области видимости функции #9
Цитата Сообщение от 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*/
}
newbie666
Заблокирован
24.04.2014, 17:54     Изменение области видимости функции #10
Цитата Сообщение от newbie666 Посмотреть сообщение
нельзя - тк в базовом классе будет к функции доступ,
точнее доступа не будет, т.к. она в дочернем классе - private, но если к ней сделать доступ пабликом - эту функция будет дочернего класса, а ТС хотел так - как я написал уже

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

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

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

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

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

такое пишут при ромбическом наследование - тут это совсем не уместно
Т.е надо реализовывать через виртуальные функции?
Просто сейчас да, я могу объявить функцию func виртуальной в A и в B написать уже новую реализацию, но здесь я функцию func писал сам и дописать её в новом классе- не проблема.
Но что если класс A писал вася пупкин неизвестно как и неизвестно когда, и мне надо написать вот такую оболочку для функции.
Лезть в исходники и разбираться или просто есть более изящный способ того, что я сделал?
newbie666
Заблокирован
24.04.2014, 18:09     Изменение области видимости функции #12
Цитата Сообщение от dmonkoff Посмотреть сообщение
Но что если класс A писал вася пупкин неизвестно как и неизвестно когда, и мне надо написать вот такую оболочку для функции
какую в хрену оболочку? Я ж вроде по русский написал, если ты хочешь, чтоб в дочернем классе у тебя присутствовала функция (со всем своим функционалом ) из базового класса и в то же время, эта функция была закрыта в дочернем классе, то делай наследование от класса A в виде private, как я тебе показал, в дочернем классе её реализовывать уже не надо. Если же ты хочешь "дописать" как то функционал уже готовой функции в дочернем классе, то это не возможно, в C# есть partial классы, но они только для дописывания нового функционала к уже существующему базового, а чтоб дописать функцию - такого нет.
dmonkoff
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 19:11  [ТС]     Изменение области видимости функции #13
Цитата Сообщение от newbie666 Посмотреть сообщение
какую в хрену оболочку? Я ж вроде по русский написал, если ты хочешь, чтоб в дочернем классе у тебя присутствовала функция (со всем своим функционалом ) из базового класса и в то же время, эта функция была закрыта в дочернем классе, то делай наследование от класса A в виде private, как я тебе показал, в дочернем классе её реализовывать уже не надо. Если же ты хочешь "дописать" как то функционал уже готовой функции в дочернем классе, то это не возможно, в C# есть partial классы, но они только для дописывания нового функционала к уже существующему базового, а чтоб дописать функцию - такого нет.
Ладно, будем думать.
Невозможность дописывать функционал меня расстраивает.
DrOffset
6421 / 3795 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
24.04.2014, 20:21     Изменение области видимости функции #14
Цитата Сообщение от 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;
}
xEmpire
23 / 23 / 9
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
30.03.2015, 00:09     Изменение области видимости функции #15
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;
}
Почему это будет работать?
DrOffset
6421 / 3795 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
30.03.2015, 00:16     Изменение области видимости функции #16
Цитата Сообщение от xEmpire Посмотреть сообщение
Почему это будет работать?
А почему не должно? Везде в этом коде ты работаешь с объектом через указатель на А. В классе А функция открыта, поэтому это работает.
xEmpire
23 / 23 / 9
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
30.03.2015, 00:21     Изменение области видимости функции #17
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, я бы это понял. Что я упустил?
DrOffset
6421 / 3795 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
30.03.2015, 00:28     Изменение области видимости функции #18
Цитата Сообщение от xEmpire Посмотреть сообщение
Таким образом ф-ия базового класса почему-то не перекрывается.
Как это не перекрывается? Ты же сам определил реализацию функции в наследнике так, что она только и делает, что вызывает функцию базового класса.
Цитата Сообщение от xEmpire Посмотреть сообщение
a->Foo();
В данном коде компилятор исходит из фактического типа указателя. Фактический тип говорит нам, что метод доступен. Поэтому и вызов возможен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 00:28     Изменение области видимости функции
Еще ссылки по теме:

C++ Области видимости функций
Возможно ли спрятать класс из области видимости? C++
C++ Области видимости

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

Или воспользуйтесь поиском по форуму:
Perfilov
264 / 165 / 43
Регистрация: 25.02.2015
Сообщений: 435
30.03.2015, 00:28     Изменение области видимости функции #19
анализ видимости функции происходит на основе статического типа.
в вашем случае статический тип - указатель на A. т.к. в классе А функция
публичная - этот код компилируется. то, что динамический объект B (а
указывает на объект типа B) в данном случае не имеет значения.
Yandex
Объявления
30.03.2015, 00:28     Изменение области видимости функции
Ответ Создать тему
Опции темы

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