45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
1

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

01.08.2009, 00:53. Показов 10085. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2009, 00:53
Ответы с готовыми решениями:

Классы, назначение спецификаторов доступа private, protected
Зачем в классах параметры доступа private, protected?Если можно написать все в public и конструкторе

Пишем свой класс, спецификатор доступа protected
Всем привет! Из книги Р. Лафоре относительно спецификатора доступа protected: Далее пишется...

Ошибка доступа access violation: почему класс-наследник не видит protected данные-члены класса-родителя?
Подскажите есть базовый класс в разделе protected разместил переменную, которая по идее должна быть...

protected или не protected : )
собстно не могу решить как поступить. есть абстрактный класс окошка, являющийся базовым для всех...

25
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 01:04 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.

1
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 01:11  [ТС] 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.
1
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 01:13 4
когда необходимо в классе наследнике изменять свойства наследуемые из базового класса (private)... короче.. вообщем когда ты будешь создавать программу с большой иерархией классов (да может случится что и не с большой), ты сам поймешь, что без этого не обойтись.
1
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
01.08.2009, 02:24 5
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
p.s: еще есть опция наследования proected.
Ну и что это такое???
1
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 02:30 6
ISergey, это опечатка видите ли, когда я печатаю не на своей клавиатуре - это частое явление.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
01.08.2009, 02:36 7
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ISergey, это опечатка видите ли, когда я печатаю не на своей клавиатуре - это частое явление.
а.. тогда вам повезло... (бывает )
1
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 02:42 8
Цитата Сообщение от ISergey Посмотреть сообщение
а.. тогда вам повезло... (бывает )
что значит повезло, дорогой друг? это угроза?
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 02:42  [ТС] 9
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
ISergey, это опечатка видите ли, когда я печатаю не на своей клавиатуре - это частое явление.
В книге Лафоре , которую вы мне посоветовали сказано, что любой программист
сможет получить доступ к членам класса, объявленными, как protected просто создавая производные классы.
Вопрос: верно ли это утверждение?
Сомнение возникло из-за противоречий между книгами Павловской и Лафоре.
В книге Павловской сказано что при наследовании сс спецификатором protected
доступ в производном классе отсутствует.
Элементы protected при наследовании с ключом доступа private становятся в производном классе private, в остальных случаях права доступа не изменяются.
1
ISergey
01.08.2009, 02:51
  #10

Не по теме:

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

0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 02:52 11
Skirmisher, ты меня запутал. Ты сейчас о чем? О свойствах protected и их доступности или о protected-наследовании?

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

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

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

p.s: открой Лафоре стр.367, там есть таблица 9.1. Там описано взаимодействие всех видов наследования со свойствами с разными видами доступа.
Тему я неверно сделал я бы хотел все узнать о protected, а то о них в книгах мало сказано(, даже у Лафоре.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
01.08.2009, 09:32 13
Protected - это уже не public, но еще и не private, со всеми вытекающими из этого последствиями
1
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 09:49 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.
1
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 12:06  [ТС] 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
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
01.08.2009, 12:41 16
Skirmisher, в таблице 9.1 того же Лафоре.. указано, что досутп к полям protected имеет сам класс и его производные.


Цитата Сообщение от Skirmisher Посмотреть сообщение
const char *idCameraPosition:ositionStr[] =
что такое *idCameraPosition ?
1
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 12:48 17
Цитата Сообщение от Skirmisher Посмотреть сообщение
C++
1
const char *idCameraPosition::positionStr[] = {
C++
1
const char *Camera::positionStr[] = {
protected:
static const char* positionStr[POSITION_COUNT];
long time;
};
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 13:01  [ТС] 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
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 13:25 19
Skirmisher, удалите свой некорректный перевод текста.
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 13:28  [ТС] 20
Цитата Сообщение от zim22 Посмотреть сообщение
Skirmisher, удалите свой некорректный перевод текста.
Уже не могу. Извините хотел , как лучше получилось, как всегда
0
01.08.2009, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2009, 13:28
Помогаю со студенческими работами здесь

PROTECTED
есть два класса: class Base{ private: int age; }; class Derived: public Base{ .......

Protected в классах
#include &lt;iostream&gt; using namespace std; class TPoint{ protected: int x,y; ...

Protected Struct
Привет народ. Сижу тут с классами корочь, и вдруг вылезла ошибка (типа нет доступа), но никак не...

Protected DVD
Доброго дня! Не нашел нужного раздела для подобной темы... Суть в чем - как можно определить,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru