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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.83
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
#1

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

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

В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2009, 00:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ключ доступа protected (C++):

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

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

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

Protected в классах - C++
#include <iostream> using namespace std; class TPoint{ protected: int x,y; TPoint *t; ...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Monte-Cristo
2788 / 1374 / 30
Регистрация: 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.

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

Не по теме:

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

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

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

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

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

p.s: открой Лафоре стр.367, там есть таблица 9.1. Там описано взаимодействие всех видов наследования со свойствами с разными видами доступа.
Тему я неверно сделал я бы хотел все узнать о protected, а то о них в книгах мало сказано(, даже у Лафоре.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
01.08.2009, 09:32 #13
Protected - это уже не public, но еще и не private, со всеми вытекающими из этого последствиями
zim22
depict1
276 / 141 / 2
Регистрация: 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.
Skirmisher
44 / 44 / 0
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2009, 12:06
Привет! Вот еще темы с ответами:

private, protected, public - C++
class test { public: test(); int getPrivate(); int vpublic; protected: int vprotected; private: int vprivate;

protected и его назначение - C++
Не понятно назначение ключевого слова протектед, хотя пишут что он нужен для класса-потомка, только зачем? Вот код, растолкуйте на нём ,что...

Доступ внука к Protected - C++
Здравствуйте, сегодня встал перед такой проблемой. Дело в том, что создал класс, наследующий public доступом по цепочке (внук). Но если...

Обращение к члену protected - C++
Добрый день, помогите разобраться Обращение к члену protected, сообщается ошибкой Код класса: #include &lt;iostream&gt; #include &lt;string&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2009, 12:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru