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

Ключ доступа protected - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.83
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 00:53     Ключ доступа protected #1
В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2009, 00:53     Ключ доступа protected
Посмотрите здесь:

PROTECTED C++
protected или не protected : ) C++
Доступ внука к Protected C++
Protected DVD C++
C++ Обращение к члену protected
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 01:04     Ключ доступа protected #2
что значит рекомендовано?
к свойствам с доступом protected имеют доступ классы наследники..

сравни два этих кода. Один из них не компилируется.
Листинг 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
private: 
    int a;
public:
    A() {}
    void Get() { cout << "a = " << a << endl; }
};
 
class B: public A
{
public:
    void Set(int x) { a = x; }
};

Листинг 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
protected: 
    int a;
public:
    A() {}
    void Get() { cout << "a = " << a << endl; }
};
 
class B: public A
{
public:
    void Set(int x) { a = x; }
};


Не по теме:

p.s: еще есть опция наследования proected.

Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 01:11  [ТС]     Ключ доступа protected #3
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
что значит рекомендовано?
к свойствам с доступом protected имеют доступ классы наследники..

сравни два этих кода. Один из них не компилируется.
Листинг 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
private: 
    int a;
public:
    A() {}
    void Get() { cout << "a = " << a << endl; }
};
 
class B: public A
{
public:
    void Set(int x) { a = x; }
};

Листинг 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
protected: 
    int a;
public:
    A() {}
    void Get() { cout << "a = " << a << endl; }
};
 
class B: public A
{
public:
    void Set(int x) { a = x; }
};


Не по теме:

p.s: еще есть опция наследования proected.

Да я хотел узнать в общем когда рекомендуется применять спецификатор или ключ доступа protected.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 01:13     Ключ доступа protected #4
когда необходимо в классе наследнике изменять свойства наследуемые из базового класса (private)... короче.. вообщем когда ты будешь создавать программу с большой иерархией классов (да может случится что и не с большой), ты сам поймешь, что без этого не обойтись.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
01.08.2009, 02:24     Ключ доступа protected #5
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
p.s: еще есть опция наследования proected.
Ну и что это такое???
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 02:30     Ключ доступа protected #6
ISergey, это опечатка видите ли, когда я печатаю не на своей клавиатуре - это частое явление.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
01.08.2009, 02:36     Ключ доступа protected #7
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ISergey, это опечатка видите ли, когда я печатаю не на своей клавиатуре - это частое явление.
а.. тогда вам повезло... (бывает )
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 02:42     Ключ доступа protected #8
Цитата Сообщение от ISergey Посмотреть сообщение
а.. тогда вам повезло... (бывает )
что значит повезло, дорогой друг? это угроза?
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 02:42  [ТС]     Ключ доступа protected #9
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ISergey, это опечатка видите ли, когда я печатаю не на своей клавиатуре - это частое явление.
В книге Лафоре , которую вы мне посоветовали сказано, что любой программист
сможет получить доступ к членам класса, объявленными, как protected просто создавая производные классы.
Вопрос: верно ли это утверждение?
Сомнение возникло из-за противоречий между книгами Павловской и Лафоре.
В книге Павловской сказано что при наследовании сс спецификатором protected
доступ в производном классе отсутствует.
Элементы protected при наследовании с ключом доступа private становятся в производном классе private, в остальных случаях права доступа не изменяются.
ISergey
01.08.2009, 02:51
  #10

Не по теме:

Цитата Сообщение от Monte-Cristo Посмотреть сообщение
что значит повезло, дорогой друг? это угроза?
нет. просто могло пойти в вашу сторону много критики( если б это была не опечатка ). ладно я наверно пива много выпил .. не обижайтесь..

Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 02:52     Ключ доступа protected #11
Skirmisher, ты меня запутал. Ты сейчас о чем? О свойствах protected и их доступности или о protected-наследовании?

я тебе советую больше верить Лафоре, чем Пвловской.

p.s: открой Лафоре стр.367, там есть таблица 9.1. Там описано взаимодействие всех видов наследования со свойствами с разными видами доступа.
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 02:55  [ТС]     Ключ доступа protected #12
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Skirmisher, ты меня запутал. Ты сейчас о чем? О свойствах protected и их доступности или о protected-наследовании?

я тебе советую больше верить Лафоре, чем Пвловской.

p.s: открой Лафоре стр.367, там есть таблица 9.1. Там описано взаимодействие всех видов наследования со свойствами с разными видами доступа.
Тему я неверно сделал я бы хотел все узнать о protected, а то о них в книгах мало сказано(, даже у Лафоре.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
01.08.2009, 09:32     Ключ доступа protected #13
Protected - это уже не public, но еще и не private, со всеми вытекающими из этого последствиями
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 09:49     Ключ доступа protected #14
Цитата Сообщение от M128K145 Посмотреть сообщение
Protected - это уже не public, но еще и не private, со всеми вытекающими из этого последствиями
вытекающие последствия самому додумывать?
***
C++ Primer, Fourth Edition
15.2.2. protected Members
The protected access label can be thought of as a blend of private and public:

Like private members, protected members are inaccessible to users of the class.

Like public members, the protected members are accessible to classes derived from this class.

In addition, protected has another important property:

A derived object may access the protected members of its base class only through a derived object. The derived class has no special access to the protected members of base type objects.

As an example, let's assume that Bulk_item defines a member function that takes a reference to a Bulk_item object and a reference to an Item_base object. This function may access the protected members of its own object as well as those of its Bulk_item parameter. However, it has no special access to the protected members in its Item_base parameter:

void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)
{
// attempt to use protected member
double ret = price; // ok: uses this->price
ret = d.price; // ok: uses price from a Bulk_item object
ret = b.price; // error: no access to price from an Item_base
}



The use of d.price is okay, because the reference to price is through an object of type Bulk_item. The use of b.price is illegal because Bulk_item has no special access to objects of type Item_base
Key Concept: Class Design and Protected Members
In the absence of inheritance, a class has two kinds of users: members of the class itself and the users of that class. This separation between kinds of users is reflected in the division of the class into private and public access levels. Users may access only the public interface; class members and friends may access both the public and private members.

Under inheritance, there is now a third kind of user of a class: programmers who will define new classes that are derived from the class. The provider of a derived class often (but not always) needs access to the (ordinarily private) base-class implementation. To allow that access while still preventing general access to the implementation, an additional access label, protected, is provided. The data and function members in a protected section of a class remain inaccessible to the general program, yet are accessible to the derived class. Anything placed within a private section of the base class is accessible only to the class itself and its friends. The private members are not accessible to the derived classes.

When designing a class to serve as a base class, the criteria for designating a member as public do not change: It is still the case that interface functions should be public and data generally should not be public. A class designed to be inherited from must decide which parts of the implementation to declare as protected and which should be private. A member should be made private if we wish to prevent subsequently derived classes from having access to that member. A member should be made protected if it provides an operation or data that a derived class will need to use in its implementation. In other words, the interface to the derived type is the combination of both the protected and public members.
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 12:06  [ТС]     Ключ доступа protected #15
Статичекое защищенное поле:
Camera.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Camera
{
public:
    Camera(long t) {
        time = t;
    }
virtual ~Camera() {
    }
protected:
    static const char* positionStr[POSITION_COUNT];
             long time;
}
Camera.cpp
C++
1
2
3
4
5
6
7
#include "Camera.h"
...
const char *idCameraPosition::positionStr[] = {
    "Fixed",
    "Interpolated",
    "Spline",
};
Возникает ошибка линковки 2001
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 12:41     Ключ доступа protected #16
Skirmisher, в таблице 9.1 того же Лафоре.. указано, что досутп к полям protected имеет сам класс и его производные.


Цитата Сообщение от Skirmisher Посмотреть сообщение
const char *idCameraPosition:ositionStr[] =
что такое *idCameraPosition ?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 12:48     Ключ доступа protected #17
Цитата Сообщение от Skirmisher Посмотреть сообщение
C++
1
const char *idCameraPosition::positionStr[] = {
C++
1
const char *Camera::positionStr[] = {
protected:
static const char* positionStr[POSITION_COUNT];
long time;
};
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 13:01  [ТС]     Ключ доступа protected #18
Защищенные члены
Защищенные члены имеют доступ к метке и могут рассматриваться, как смешение свойств закрытых и открытых полей:

Схожее свойство закрытым членам: защищенные члены недоступны пользователям
класса.

Схожее свойство с открытыми членами: защищенные члены доступны в классах производных от этого класса.

В дополнение защищенные члены имееют другое значительное свойство:

Объект производного класса может получить доступ к защищенными членами
этого базового клсса только через объект производного класса. Производный класс
не имеет специального доступа к защищенным членам объектов этого базового класса(типа).

Например: позволим принимать определения Bulk_item методу, который ссылается на объект Bulk_item и ссылается на объект Item_base. Эта функция может иметь доступ к защищенным членам основного объекта также, как все эти параметры Bulk_item/
Однако, он не имеет специального доступа к защищенным членам в параметре Bulk_item:
void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)
{
// доступ для того чтобы использовать защищенный член
double ret = price; // ok: используй this->price
ret = d.price; // ok: использую price от объекта Bulk_item
ret = b.price; // ошибка: нет доступа к price от Item_base
}
Когда проектируешь класс, для того чтобы продолжить работать с базовым классом,
критерий проектирования члена, такого как public не изменяйте: он по-прежнему, является случаем интерфейса функций должны быть как public и данные в основном должны быть, как не public. Класс спроектированный для того чтобы наследовать от
должных решенных частей выполнения, для того чтобы объявить их, как защищенные
и некоторые должны быть закрытыми . Член должен быть закрытым, если мы желаем предотвратить более поздние производные классы от доступа к этому члену. Член должен быть защищенным, если он поставляет операцию или данные, которые будут нуждаться к использованию в производном классе при его выполнении. Другими словами интерфейс производного класса является комбинацией обоих защищенных
и открытых членов.


Добавлено через 2 минуты 12 секунд
Цитата Сообщение от Skirmisher Посмотреть сообщение
Статичекое защищенное поле:
Camera.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Camera
{
public:
        Camera(long t) {
                time = t;
        }
virtual ~Camera() {
        }
protected:
        static const char* positionStr[POSITION_COUNT];
             long time;
}
Camera.cpp
C++
1
2
3
4
5
6
7
#include "Camera.h"
...
const char *Camera::positionStr[] = {
    "Fixed",
    "Interpolated",
    "Spline",
};
Вот такой код, однако все равно выдает lnk2001
Возникает ошибка линковки 2001
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 13:25     Ключ доступа protected #19
Skirmisher, удалите свой некорректный перевод текста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2009, 13:28     Ключ доступа protected
Еще ссылки по теме:

Protected Struct C++
Protected в классах C++
Пишем свой класс, спецификатор доступа protected C++

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

Или воспользуйтесь поиском по форуму:
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 13:28  [ТС]     Ключ доступа protected #20
Цитата Сообщение от zim22 Посмотреть сообщение
Skirmisher, удалите свой некорректный перевод текста.
Уже не могу. Извините хотел , как лучше получилось, как всегда
Yandex
Объявления
01.08.2009, 13:28     Ключ доступа protected
Ответ Создать тему
Опции темы

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