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

Полиморфизм и private методы - C++

Восстановить пароль Регистрация
 
Care
76 / 32 / 3
Регистрация: 04.06.2013
Сообщений: 295
18.08.2013, 02:48     Полиморфизм и private методы #1
Почему при полиморфном вызове функции возможен вызов private метода??? Хотя бы предупреждение какое нить об изменении спецификатора доступа с public в 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
29
30
31
32
33
#ifndef CLASS_H
#define CLASS_H
 
 
#include <iostream>
 
class Abstract
{
public:
    virtual void test() = 0;
    virtual ~Abstract(){} 
};
 
class One : public Abstract
{
public:
    void test()
    {
        std :: cout << "TEST :: ONE" << std :: endl;
    }
};
 
class Two : public One 
{
private:  //PRIVATE
    void test()
    {
        std :: cout << "TEST :: TWO" << std :: endl;
    }
};
 
 
#endif
Класс Two получается изменяет модификатор доступа:?

Вот main:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include "Class.h"
 
using namespace std;
 
 
int main()
{
    
    Abstract *abs = new Two;
    abs -> test();
 
    delete abs;
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2013, 02:48     Полиморфизм и private методы
Посмотрите здесь:

Полиморфизм C++
Полиморфизм C++
Полиморфизм :( C++
C++ Как переделать с public на private и создать методы для закрытых полей?
Полиморфизм C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.08.2013, 03:43     Полиморфизм и private методы #2
Care, Нет, не изменяет. Ведь, если мы создадим объект типа Two - мы не сможем вызвать данную функцию.
Здесь же вызывается по факту функция класса Abstract, но т.к. она виртуальная - вызывается переопределенная.
n3376 11.5/1
The access rules (Clause 11) for a virtual function are determined by its declaration and are not affected by
the rules for a function that later overrides it.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class B {
public:
virtual int f();
};
class D : public B {
private:
int f();
};
void f() {
D d;
B* pb = &d;
D* pd = &d;
pb->f(); // OK: B::f() is public,
// D::f() is invoked
pd->f(); // error: D::f() is private
}
n3376 11.5/2
Access is checked at the call point using the type of the expression used to denote the object for which the
member function is called. The access of the member function in the class in
which it was defined is in general not known.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
18.08.2013, 07:48     Полиморфизм и private методы #3
Цитата Сообщение от Care Посмотреть сообщение
Класс Two получается изменяет модификатор доступа:?
Только для себя!
Можете попробовать еще приватное наследование.
Care
76 / 32 / 3
Регистрация: 04.06.2013
Сообщений: 295
18.08.2013, 10:42  [ТС]     Полиморфизм и private методы #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Только для себя!
Можете попробовать еще приватное наследование.
Я не совсем понимаю для чего нужно приватное и защищённое наследование ... Где оно применяется ?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
18.08.2013, 10:57     Полиморфизм и private методы #5
Цитата Сообщение от Care Посмотреть сообщение
Я не совсем понимаю для чего нужно приватное и защищённое наследование ... Где оно применяется ?
Вместо композиции. + можно получить доступ к protected полям\методам базового класса, при этом запрещая неявное приведение к базовому классу.
Care
76 / 32 / 3
Регистрация: 04.06.2013
Сообщений: 295
18.08.2013, 11:05  [ТС]     Полиморфизм и private методы #6
Цитата Сообщение от gray_fox Посмотреть сообщение
Вместо композиции. + можно получить доступ к protected полям\методам базового класса, при этом запрещая неявное приведение к базовому классу.
Да но при этом нету отношения "является" разве это можно назвать наследованием??

Добавлено через 1 минуту
Скорей это автоматическая организация композиции , а не наследование )
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
18.08.2013, 11:16     Полиморфизм и private методы #7
Цитата Сообщение от Care Посмотреть сообщение
Да но при этом нету отношения "является" разве это можно назвать наследованием??
Ну, в "классическом понимании", да, это не наследование. Т.е. отношение не "является", а "реализованно посредством".

Добавлено через 4 минуты
В качестве примера использования: мне вот всегда казалось немного странным, что у адапторов контейнеров нет возможности получить доступ к контейнеру. С помощию закрытого\защищённого наследования это легко решается, например:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <stack>
 
 
template<typename Type, typename Container = std::deque<Type>>
class stack : protected std::stack<Type, Container> {
 
   using base_type = std::stack<Type, Container>;
 
public:
   using container_type    = typename base_type::container_type;
   using value_type        = typename base_type::value_type;
   using size_type         = typename base_type::size_type;
   using reference         = typename base_type::reference;
   using const_reference   = typename base_type::const_reference;
 
   
   using base_type::top;
   
   using base_type::empty;
   using base_type::size;
 
   using base_type::push;
   using base_type::emplace;
   using base_type::pop;
   using base_type::swap;
 
   using base_type::base_type;
 
   container_type & get_container() noexcept {
      return this->c;
   }
   constexpr container_type const& get_container() const noexcept {
      return this->c;
   }
};
 
 
int main() {
   stack<int> values;
   
   for (int i = 0; i != 10; ++i) {
      values.push(i);
   }
 
   for (auto value : values.get_container()) {
      std::cout << value << std::endl;
   }
}
http://ideone.com/Jhps8o
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2013, 11:23     Полиморфизм и private методы
Еще ссылки по теме:

C++ Полиморфизм
C++ Полиморфизм в с++
C++ Полиморфизм и шаблонные методы класса

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

Или воспользуйтесь поиском по форуму:
Care
76 / 32 / 3
Регистрация: 04.06.2013
Сообщений: 295
18.08.2013, 11:23  [ТС]     Полиморфизм и private методы #8
Очень интересно спасибо.
Yandex
Объявления
18.08.2013, 11:23     Полиморфизм и private методы
Ответ Создать тему
Опции темы

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