Форум: Форум C++Разное
Новые темы: 00
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не получается обратиться из производного класса к члену базового класса
 
 автор: DarKo   (06.11.2011 в 14:36)   письмо автору
 
 

Вопрос в следующем:

Есть базовый класс, с переменными типа bool.
Наследующий класс имеет методы, использующие значения этих переменных.

Создается объект базового класса, определяется значение переменных.
Создается объект наследующего класса.

Однако, методы(наслед. класса) не работают.
Как мне кажется, проблема в том, что переменные, используемые непосредственно в методе,
не те что инициализировал конструктор базового класса.

Собственно вопрос - как "привязать" эти переменные(объекта базового класса)
к методу насл. класса?
Помогите, плиз)
Или подскажите, где поискать ответ)

  Ответить  
 
 автор: cheops   (06.11.2011 в 14:57)   письмо автору
 
   для: DarKo   (06.11.2011 в 14:36)
 

А спецификаторы доступа у методов какие (public, private, protected)? Если спецификатор доступа private (или вообще не указан, что эквивалентно private) - они не будут доступны никому, в том числе и наследнику. Если спецификатор доступа public, методы будут доступны всем. Если спецификатор доступа protected, методы будут доступны только наследникам (внешнему коду они не будут доступны).

  Ответить  
 
 автор: DarKo   (06.11.2011 в 15:47)   письмо автору
 
   для: cheops   (06.11.2011 в 14:57)
 

У методов - public, у переменных - protected. Но, как мне кажется, проблема не в этом.
Программа компилируется нормально, методы работают, но не правильно.

вот пример:

class Base
{
 protected:
     bool a;

 public:
     Base() : a(true){}
};

class Date : protected Base
{
 public:
    void print();
};
void Date::print()
{
  cout<<"Начало";
  if(a==true)
  cout<<"Работает";
  if(a==false)
  cout<<"Работает2";   // для проверки)
  соut<<"Конец";
}

//собственно программа
Base b;
Date c;

void main()
{
  c.print();
}


На выходе получаем:
НачалоКонец

Переменная, вообще, не имеет значения.

  Ответить  
 
 автор: DarKo   (06.11.2011 в 16:11)   письмо автору
 
   для: DarKo   (06.11.2011 в 15:47)
 

Да, и тема немного не соответствует проблеме)
Не получается обратиться к переменным базового класса.

  Ответить  
 
 автор: DarKo   (06.11.2011 в 16:19)   письмо автору
 
   для: DarKo   (06.11.2011 в 16:11)
 

Перепроверил:
На выходе - Начало Работает2 Конец
Получается вооl a = false, а должен быть true.

  Ответить  
 
 автор: cheops   (06.11.2011 в 16:25)   письмо автору
 
   для: DarKo   (06.11.2011 в 16:19)
 

А чем компилируете?

  Ответить  
 
 автор: cheops   (06.11.2011 в 16:24)   письмо автору
 
   для: DarKo   (06.11.2011 в 15:47)
 

А вы где этот пример компилируете? У меня он, после небольшого дополнения (стандартная библиотека, форматирование исправление последнего cout) в Visual Studio выдает
Начало
Работает
Конец

  Ответить  
 
 автор: DarKo   (06.11.2011 в 16:46)   письмо автору
 
   для: cheops   (06.11.2011 в 16:24)
 

Хм...
Проверил сам пример, все работает нормально))

Но проблема в том, что в программе которую я пишу используется этот же принцип. И она не работает как надо.
Видно я просто где-то накасячил) Буду искать где))
Спасибо)

  Ответить  
 
 автор: DarKo   (06.11.2011 в 17:43)   письмо автору
 
   для: DarKo   (06.11.2011 в 16:46)
 

Нашел где проблема.
Я инициализировал переменные в отдельном методе базового класса.
Засунул этот метод в конструктор, и все - ок)

Но у меня возник вопрос.
Если я создаю несколько объектов базового класса. Как сделать, чтобы метод насл.класса обращался к переменным этих объектов?

  Ответить  
 
 автор: cheops   (06.11.2011 в 18:24)   письмо автору
 
   для: DarKo   (06.11.2011 в 17:43)
 

Не очень понятно в чем сложность? К переменной или методы базового класса (в том числе к методу, который был закрыт перегруженным методом) можно обратиться при помощи префикса Base:: Или речь идет о чем-то другом?

  Ответить  
 
 автор: DarKo   (06.11.2011 в 20:00)   письмо автору
 
   для: cheops   (06.11.2011 в 18:24)
 

Немного о другом)

есть три объекта класса Base - a, b, c.
есть один объект класса Date(наследующего) d.
Как сделать чтоб методы d использовали значение переменных a, b или с?

  Ответить  
 
 автор: cheops   (06.11.2011 в 21:52)   письмо автору
 
   для: DarKo   (06.11.2011 в 20:00)
 

А объекты a, b и с - это разные объекты? Тогда никак, это просто другой участок памяти, вы можете объект d привести к базовому типу Base, и сослаться на этот приведенный объект при помощи ссылки или указателя - в этом случае вам удастся сделать так, чтобы указатель и переменная оперировали одними и теми же переменными.

  Ответить  
 
 автор: DarKo   (06.11.2011 в 22:47)   письмо автору
 
   для: cheops   (06.11.2011 в 21:52)
 

Ясно)
Буду учить указатели. Спасибо за помощь)

  Ответить  
 
 автор: cheops   (07.11.2011 в 00:37)   письмо автору
 
   для: DarKo   (06.11.2011 в 22:47)
 

>Буду учить указатели. Спасибо за помощь)
Не ради поучения, а пользы для: указатели лучше выучить как "отче наш", долбать их до полного понимания и автоматизма, иначе смысла нет C++ изучать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования