Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить доступ к закрытым членам при наследовании 
:(
    Опции темы
boobie
Дата 22.8.2012, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Доброго времени суток! 
Как получить доступ к закрытым по умолчанию членам базового класса из производного класса?
Условный пример:
Код

class c1
{
     int x;
public:
     int y;
};
class c2: public c1
{
public:
     void ololo()
     { x=10;//так не работает
        с1::x=9;//и так тоже
      };

Как-то так... Это вообще возможно?
Пишу в VC++ 2010.

Ах, и еще... Френдовые функции использовать не надо.

Это сообщение отредактировал(а) boobie - 22.8.2012, 07:58
PM   Вверх
math64
Дата 22.8.2012, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Никак. Сделать их protected - вот правильное решение.
PM   Вверх
boobie
Дата 22.8.2012, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Ну ладно... А если они "private" то никак, да?
PM   Вверх
borisbn
Дата 22.8.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(boobie @  22.8.2012,  08:14 Найти цитируемый пост)
А если они "private" то никак, да?

никак. только при помощи грязного хака
Код
class c1 {
    int x;
};

class c2 : public c1
{
class c1_hack {
public:
    int x;
};
    void ololo() {
        c1_hack * hack = (c1_hack *)this;
        hack->x = 42; // ну откуда вы берёте эти 10 или 9 )))
    }
};


который я ни в коем случае не рекомендую применять


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kosmonaFFFt
Дата 22.8.2012, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



А как же #define private protected перед наследованием, а затем #undef private? Вроде должно сработать, хотя сам не пробовал...


--------------------
user posted image
PM MAIL ICQ   Вверх
borisbn
Дата 22.8.2012, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(kosmonaFFFt @  22.8.2012,  08:56 Найти цитируемый пост)
А как же #define private protected перед наследованием, а затем #undef private

если в классе этот private вообще есть... тогда - да. проще. а если как в примере ТС (тип видимости по-умолчанию) ?

Добавлено @ 09:40
Кстати, тогда должно помочь #define class struct ?

Это сообщение отредактировал(а) borisbn - 22.8.2012, 09:41


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kosmonaFFFt
Дата 22.8.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Хм, даже не задумывался, что можно использовать тип видимости по умолчанию - привык объявлять все в порядке public -> protected -> private...

З.Ы. Тогда #define class struct надо делать перед подключением заголовочного файла.


--------------------
user posted image
PM MAIL ICQ   Вверх
borisbn
Дата 22.8.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(kosmonaFFFt @  22.8.2012,  11:23 Найти цитируемый пост)
Тогда #define class struct надо делать перед подключением заголовочного файла

как, собственно, и
Цитата(kosmonaFFFt @  22.8.2012,  08:56 Найти цитируемый пост)
#define private protected 

 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 24.8.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Вроде бы никто не предложил вариант использовать просто функцию-член базового класса (не друга), типа

Код

void set_x(int x){this->x=x;}


и вызвать её в наследнике. 

Код

class c2: public c1
{
public:
     void ololo()
     { //x=10;//так не работает
       // с1::x=9;//и так тоже
       set_x(42);
     }
}; 
 


Такой вариант не противоречит условиям автора smile
PM MAIL   Вверх
borisbn
Дата 24.8.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



> Такой вариант не противоречит условиям автора 
Из недосказанного автором (кстати, где он) я понял, что базовый класс менять нельзя. Иначе можно было бы просто заменить private на protected 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 24.8.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



>Иначе можно было бы просто заменить private на protected  

вроде Мэйерс пишет, что protected члены класса вообще по сути не являются инкапсулированными, поэтому с этой точки зрения менять private на protected не стоило бы smile Но, если это не учитывать, то, конечно, можно было бы.
PM MAIL   Вверх
boobie
Дата 25.8.2012, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Цитата(borisbn @ 24.8.2012,  10:40)
> Такой вариант не противоречит условиям автора 
Из недосказанного автором (кстати, где он) я понял, что базовый класс менять нельзя. Иначе можно было бы просто заменить private на protected

Да тут я, тут  smile 
Внимательно читал эту тему, видел все сообщения... Вопрос то и был - можно или нельзя. Поэтому вопросов больше нет - исправил базовый класс, поставил "protected", на всякий пожарный еще и "зафрендил"  smile 

С define-ом как-то некрасиво получается... топорно как-то  smile 

Грязный хак - очень красиво, но не всегда такое прокатит...

Дописать функцию-член в базовый класс - в данном случае, конечно, сойдет... Но только в данном случае.



Это сообщение отредактировал(а) boobie - 25.8.2012, 09:48
PM   Вверх
borisbn
Дата 25.8.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Ага... расследование показало, что изменять базовый всё-таки можно. Тогда лучше всего будет добавить функции доступа get/set, как и советовал мой земляк.
А френдить наследника в базовом мягко говоря нелогично


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boobie
Дата 25.8.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Да, можно... Но для начала я хотел убедиться, что без этого не обойтись.

У меня совсем другая задача - Разработать класс LowString (строка из прописных символов), наследованный от класса String (который я тоже сам написал). Так вот там эта функция... не нужна. Нужен был доступ к закрытым членам... Вот я и придумал такой пример и задал вопрос.  smile 

Это сообщение отредактировал(а) boobie - 25.8.2012, 10:21
PM   Вверх
NoviceF
Дата 25.8.2012, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(boobie @  25.8.2012,  09:22 Найти цитируемый пост)
поставил "protected", на всякий пожарный еще и "зафрендил"


поясни, плс, что именно и где зафрендил, просто для себя хочу понять smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0829 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.