Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 18:16   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию Обращение к унаследованным свойствам внутри класса

Есть класс:
Код:
class AAA {
private:
int PNum;
//...
}
И его наследник:
Код:
class BBB : public AAA {
private:
//...
public:
fn() {
PNum++; // как обратиться к свойству унаследованному от AAA ?
}
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 11.01.2012, 18:27   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

t2skler

как обратиться к свойству унаследованному от AAA ?

Никак. Свойство private не для того вводили, чтобы кому попало данные отдавать.
Rififi вне форума Ответить с цитированием
Старый 11.01.2012, 19:36   #3
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Но они же должны становиться приватными и для этого класса, а внутри класса мы можем обращаться к приватным свойствам.

class AAA {
private:
int PNum;
//...
public:
void PFive() {
PNum += 5;
}
}
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 11.01.2012, 21:08   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от t2skler Посмотреть сообщение
Но они же должны становиться приватными и для этого класса, а внутри класса мы можем обращаться к приватным свойствам.
Приватные свойства никому ничего не должны. А обратиться к ним можно только из того класса, в котором они описаны (и из друзей), а не из классов-наследников
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 12.01.2012, 05:26   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

На самом деле, можно получить доступ к приватным данным любого класса.
Только нужно выполнить ряд условий:

1. Нужно очень сильно этого хотеть, ибо это "взлом природной защиты класса".
2. Отдавать отчет себе в том, что делаешь, и какие могут быть последствия.
3. Нужно знать внутренне устройство класса, который необходимо подвергнуть взлому.
4. Что бы избавить себя от необходимости каждый раз вникать во внутреннее устройство класса-жертвы, можно использовать технику "манипулятивных классов". Но это противоречит пункту 2.

Манипулятивные классы - это классы, которые не имеют собственных данных-членов, за исключением одного указателя. Такие классы умеют "нацеливаться" на данные-члены классов заданного типа. И делать с этими данными все что угодно так, словно это их собственные данные.

Область применения манипулятивных классов: альтернатива полиморфизму, либо "Белый ящик" - обеспечение доступа ко всем данным исследуемого класса в режиме отладки.

/зы Всегда дешевле исправить причину, чем бороться с последствиями. Поэтому, если есть такая возможность - лучше ещё раз пересмотреть архитектуру, а не пытаться бороться с последствиями её ущербности.

Последний раз редактировалось _Bers; 12.01.2012 в 05:30.
_Bers вне форума Ответить с цитированием
Старый 12.01.2012, 06:28   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
На самом деле, можно получить доступ к приватным данным любого класса.
Только нужно выполнить ряд условий:

1. Нужно очень сильно этого хотеть, ибо это "взлом природной защиты класса".
2. Отдавать отчет себе в том, что делаешь, и какие могут быть последствия.
3. Нужно знать внутренне устройство класса, который необходимо подвергнуть взлому.
4. Что бы избавить себя от необходимости каждый раз вникать во внутреннее устройство класса-жертвы, можно использовать технику "манипулятивных классов". Но это противоречит пункту 2.
На самом деле, можно сделать абсолютно что угодно, и даже немного больше. Например можно придумать свой вариант стандарта языка, в котором кто угодно может обращаться к приватный мемберам, написать для него компилятор, и радоваться.

Вы действительно считаете, что оно надо ТС?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 12.01.2012, 06:46   #7
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

А создание паблик функции изменяющую Pnum в классе ААА не решает проблему?
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 12.01.2012, 07:02   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
На самом деле, можно сделать абсолютно что угодно, и даже немного больше. Например можно придумать свой вариант стандарта языка, в котором кто угодно может обращаться к приватный мемберам, написать для него компилятор, и радоваться.

Вы действительно считаете, что оно надо ТС?
Да это так, для общего развития.
ТС произвел на меня впечатление человека, который изучает "правила" использования модификаторов доступа. Но он пока ещё не осознал "идею". То есть, он не вполне понимает, зачем это вообще нужно.

ТС нужно понять самую идею модификаторов доступа. А именно: в чем заключается их смысл? Для чего они нужны?

И тогда ему станет очевидно, почему потомки в общем случае не имеют доступа к приватным данным предка.

Так же, ему станет очевидно когда, и зачем нужны те, или иные модификаторы доступа при проектировании собственной архитектуры.


Допустим я сделал класс:

Код:
class СTool
{
public:
   ... //весь публичный интерфейс
protected:
   ... //позаботимся о будущем развитии инструмента
       //здесь методы и данные, которые будут доступны для потомков
private:
   ...  //сердце класса. Доступ разрешён только создателю класса
        //Всем остальным даже знать не нужно, что здесь происходит
};
Если каждый желающий сможет вмешиваться в работу класса. И подкручивать ему винтики, то велик риск ничайно что-то там внутри поломать. В этом случае класс не может гарантировать стабильную работу. Вот что бы этого не происходило, создатель класса все самое ценное прячет в приватной зоне.

Таким образом достигается негласное соглашение между разработчиком класса, и пользователями этого класса: "используйте возможности моего класса согласно его документации, и он гарантирует вам стабильную работу".

Все то, что приватное, специально делается приватным, специально для того, что бы никто снаружи доступ получить не мог.

Если по какой то причине, для стабильной работы всей архитектуры потребовалось, что бы один кусок кода получил доступ к приватной зоне другого куска кода, то в 99,(9) случаев это означает, что сама по себе архитектура ущербна. Таких ситуаций быть не должно. Это - ошибка проектировщика.

Классы - это способ разделения ответственности за работоспособность всей системы между отдельным кусками кода.

Разные классы могут писать разные программисты. Поэтому, можно сказать, что классы - это способ разделения ответственности за работоспособность всей системы между отдельными программистами.

Последний раз редактировалось _Bers; 12.01.2012 в 07:36.
_Bers вне форума Ответить с цитированием
Старый 13.01.2012, 21:24   #9
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Да это так, для общего развития.
ТС произвел на меня впечатление человека, который изучает "правила" использования модификаторов доступа. Но он пока ещё не осознал "идею". То есть, он не вполне понимает, зачем это вообще нужно.

ТС нужно понять самую идею модификаторов доступа. А именно: в чем заключается их смысл? Для чего они нужны?

И тогда ему станет очевидно, почему потомки в общем случае не имеют доступа к приватным данным предка.

Так же, ему станет очевидно когда, и зачем нужны те, или иные модификаторы доступа при проектировании собственной архитектуры.


Допустим я сделал класс:

Код:
class СTool
{
public:
   ... //весь публичный интерфейс
protected:
   ... //позаботимся о будущем развитии инструмента
       //здесь методы и данные, которые будут доступны для потомков
private:
   ...  //сердце класса. Доступ разрешён только создателю класса
        //Всем остальным даже знать не нужно, что здесь происходит
};
Если каждый желающий сможет вмешиваться в работу класса. И подкручивать ему винтики, то велик риск ничайно что-то там внутри поломать. В этом случае класс не может гарантировать стабильную работу. Вот что бы этого не происходило, создатель класса все самое ценное прячет в приватной зоне.

Таким образом достигается негласное соглашение между разработчиком класса, и пользователями этого класса: "используйте возможности моего класса согласно его документации, и он гарантирует вам стабильную работу".

Все то, что приватное, специально делается приватным, специально для того, что бы никто снаружи доступ получить не мог.

Если по какой то причине, для стабильной работы всей архитектуры потребовалось, что бы один кусок кода получил доступ к приватной зоне другого куска кода, то в 99,(9) случаев это означает, что сама по себе архитектура ущербна. Таких ситуаций быть не должно. Это - ошибка проектировщика.

Классы - это способ разделения ответственности за работоспособность всей системы между отдельным кусками кода.

Разные классы могут писать разные программисты. Поэтому, можно сказать, что классы - это способ разделения ответственности за работоспособность всей системы между отдельными программистами.
Больше спасибо за полное объяснение работы с директивами доступа понятным языком
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс внутри класса Prontit Общие вопросы Delphi 16 07.10.2011 08:30
Обращение к из одной функции класса к другой того же класса,не указывая к какому объекту она относиться zipwind C++ Builder 1 09.04.2011 17:18
Обращение к члену класса _ILYA_ Visual C++ 2 13.10.2010 19:28
Обращение к строке внутри файла AlexeyLed Общие вопросы C/C++ 3 04.03.2009 19:53
Программное обращение к свойствам файлов и их изменение lemonhead Общие вопросы Delphi 1 24.07.2008 10:20