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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2012, 00:19   #1
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию Обращение к базовому классу

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

Как в С++ обращение к базовому классу из дочернего?
В AS3 super.свойство, в php self::свойство или parent::свойство. А как в С++? base.свойство?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 31.12.2012, 00:32   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Динамически вроде никак, из-за возможности множественного наследования.
А статически BAS::somevalue;
Код:
class BAS 
{
	int somevalue;
};

class NXT : public BAS
{
	int somevalue;
};
Можно исхитриться и для своей иерархии применить:
Код:
class BAS {};

class NXT : public BAS
{
	typedef BAS mybas;
};

Последний раз редактировалось EUGY; 31.12.2012 в 00:34.
EUGY вне форума Ответить с цитированием
Старый 31.12.2012, 01:45   #3
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Все разрешённые методы и свойства класса предка автоматом, доступны ребёнку... вам не нужно обращаться к нему так таковому.
попасть в защищенный даже детям раздел, можно но тут уже нужно сильно мудрить. ибо изначально задумывалось, что объект, при наследовании может использовать лишь, то что разрешил другой прогер...
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 31.12.2012, 01:48   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Иногда как раз нужно.
Вот в примере, и базовый и дочерний класс имеют поля-синонимы.
Из дочернего класса нужно обратиться именно к полю базового.
EUGY вне форума Ответить с цитированием
Старый 31.12.2012, 01:53   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Иногда как раз нужно.
Вот в примере, и базовый и дочерний класс имеют поля-синонимы.
Из дочернего класса нужно обратиться именно к полю базового.
В таком случаи...
можно this преобразовать в предка... да хоть в самого старца в иерархии...
и юзайте его методы.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 31.12.2012, 01:56   #6
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

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

EUGY, как раз это я нашла на просторах инета. Но я не помню, чтобы когда-то так делала, в смысле вот это
Цитата:
typedef BAS mybas;
писала. Это нововведение? Или я уже настолько привыкла к PHP с его parent::?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 31.12.2012, 01:57   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
можно this преобразовать в предка.
Имеешь ввиду ((BAS*) this)->somevalue; ?
Можно и так.
А можно так BAS::somevalue.
EUGY вне форума Ответить с цитированием
Старый 31.12.2012, 02:02   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Имеешь ввиду ((BAS*) this)->somevalue; ?
Можно и так.
А можно так BAS::somevalue.
необязательно использовать тип.
Код:
class TBase

class TClock: public TBase

void TClock::myfunc(void)
{
   (TBase*)(this)->func();
}
//---
связи с тем что не всекомпилы хороши
лучше писать так
Код:
((TBase*)this)->func();
////
Если совсем без заморочек... а вы к нему часто обращаетесь
можно выделить под него свойство, возвращающие вам преобразованый указатель.

или пойти методом EUGY
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 31.12.2012 в 02:09.
Perchik71 вне форума Ответить с цитированием
Старый 31.12.2012, 02:10   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Как я и писал, проблема во множественном наследовании.
Предположим, что вдруг в c++ появилось ключевое слово parent::
На какого предка указывать в случае
Цитата:
class nxt : public bas1, bas2, bas3 {....};
Вот и приходится подставлять костыли, если множественное наследование в собственной иерархии не предполагается и очень хочется использовать тип базового класса в дочернем без явного указания типа.

На шаблонах довольно интересно получается такая конструкция:
Код:
class BAS
{
    public:
        typedef char mybase;
};

template <class D, class B> class cast : public B
{
    public:
        typedef B mybase;
};

class NXT : public cast<NXT, BAS>
{

};
То есть в отличие от классического наследования, базовый класс знает своего наследника и наследник может динамически вызвать базовый.
EUGY вне форума Ответить с цитированием
Старый 31.12.2012, 02:44   #10
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Нашла!
__super
работает только в компиляторе VS, судя по отзывам.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перекрестное приведение к родственному классу в иерархии hick91 Общие вопросы C/C++ 5 25.12.2012 11:23
Как передать обьетк классу??? KoctR Общие вопросы C/C++ 11 25.03.2012 17:22
Как привязать функцию к классу? minamoto Общие вопросы Delphi 26 25.08.2011 16:08
Параметр классу? Непонятный с++. jojahti Общие вопросы C/C++ 4 16.10.2009 08:55
Обратиться к классу (Delphi) Air Помощь студентам 16 17.07.2008 19:51