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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2012, 17:48   #1
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию Виртуальные функции и не только.

вот что нужно сделать к заданию:
Задание к работе
Общая постановка. Программа должна содержать:
• базовый класс Х, включающий два элемента х1, х2 типа int,
• конструктор с параметрами для создания объектов в динамической области памяти,
• деструктор,
• виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние.
• производный класс У, включающий один элемент у типа int ,
• конструктор с параметрами и списком инициализаторов, передающий данные конструктору базового класса,
• переопределенные методы просмотра текущего состояния объектов и их переустановки в новое состояние.

Варианты заданий
Создать в производном классе метод Run, определяющий:
5. Значение (х1+х2)/у

Вот что я пока что сделал:
Код:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>

using namespace std;

class X
{
  public:
	  int x_1, x_2;
	  X() 
	  {
		 int *peremen;
		 peremen = (int *) calloc(50,sizeof(int));
		 x_1 = 4; 
		 x_2 = 5;
	  }
	  ~X()
	  {
		  printf("\n \n  destructor");
	  }
};


class D : public X
{
  public:
	  D()
	  {
	  };
	  virtual void Metod_X()
	  { 
		  printf("%d \n %d",x_1,x_2);
	  }
};

class Y
{
public:
	int y;
	Y()
	{
		y = 4;
	};
};

void main()
{
	
	////////////////
	D d;
	X *p;
	p = &d;
	int m = p -> x_1;
	//int j = ((D*)p)p->y; // Прямое преобразование указателя на D 
	///////////////
	cout << "Базовый класс который виден на прямую = " << m;
	getchar();
}
Теперь вопросы:
1. Что значит "виртуальные методы просмотра текущего состояния и ПЕРЕ УСТАНОВКИ ОБЪЕКТОВ базового класса в новое состояние." ?
т.е в методе Metod_X() должны быть какие то переменные которыми он замещает переменные базового класса?

2.что значит "конструктор с параметрами и списком инициализаторов, передающий данные конструктору базового класса"? (т.е конструктор D например передает конструктору Х какие то параметры?)

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

4.Что бы был на прямую виден класс то мы делаем так:
int m = p -> x; // Базовый класс виден напрямую
А как сделать прямое преобразования указателя на D?
говорили что как то так, но не работает( int j = ( ( D* ) p )p -> y ??
Тёма_) вне форума Ответить с цитированием
Старый 03.06.2012, 19:06   #2
Максай
Пользователь
 
Аватар для Максай
 
Регистрация: 21.07.2008
Сообщений: 40
По умолчанию

  1. Цитата:
    Что значит "виртуальные методы просмотра текущего состояния и ПЕРЕ УСТАНОВКИ ОБЪЕКТОВ базового класса в новое состояние." ?
    т.е в методе Metod_X() должны быть какие то переменные которыми он замещает переменные базового класса?
    Нет, это значит, что в классе Х должны быть виртуальные методы просмотра состояния и переустановки объектов базового класса в новое состояние.
    Как-то вроде этого:
    Код:
    class X // Базовый класс.
    {
        private:
            // Переменная, обозначающая состояние объекта класса.
            bool state;
    
        public:
            // Метод, переустанавливающий объект класса в новое состояние.
            virtual void set_state( bool new_state )
            {
                state = new_state;
                return;
            }
    
            // Метод для просмотра состояния объекта класса.
            virtual bool get_state() { return state; }
    };
  2. Цитата:
    что значит "конструктор с параметрами и списком инициализаторов, передающий данные конструктору базового класса"? (т.е конструктор D например передает конструктору Х какие то параметры?)
    Да, именно. Что-то вроде этого:
    Код:
    class X // Базовый класс.
    {
        public:
            X( int arg1, bool arg2 );
    };
    
    class D : public X // Производный класс.
    {
        public:
    
            long var1;
            long var2;
    
            //  Конструктор с параметрами...
            D( long arg1, long arg2, int arg3, bool arg4 )
                // ... и списком инициализаторов, ...
                : var1( arg1 )
                , var2( arg2 )
                // ... передающий данные конструктору базового класса.
                , X( arg3, arg4 )
            {}
    };
  3. Цитата:
    что значит "переопределенные методы просмотра текущего состояния объектов и их переустановки в новое состояние."?
    Это означает, что производный класс должен переопределить виртуальные методы базового класса. Вот так:
    Код:
    #include <string>
    
    class X // Базовый класс.
    {
        private:
            // Переменная, обозначающая состояние объекта класса.
            bool state;
    
        public:
            // Метод, переустанавливающий объект класса в новое состояние.
            virtual void set_state( bool new_state )
            {
                state = new_state;
                return;
            }
    
            // Метод для просмотра состояния объекта класса.
            virtual bool get_state() { return state; }
    };
    
    class D : public X // Производный класс.
    {
        private:
            // Конечно, на практике в этом нет смысла, но для примера...
            std::string derived_state;
    
        public:
            // Переопределяем виртуальный метод базового класса.
            void set_state( bool new_state )
            {
                derived_state = new_state ? "good" : "bad";
                return;
            }
    
            // Переопределяем виртуальный метод базового класса.
            bool get_state()
            {
                if( derived_state == "good" ) return true;
                else return false;
            }        
    };
  4. Цитата:
    Что бы был на прямую виден класс то мы делаем так:
    int m = p -> x; // Базовый класс виден напрямую
    А как сделать прямое преобразования указателя на D?
    говорили что как то так, но не работает( int j = ( ( D* ) p )p -> y ??
    Вот этот вопрос не очень понял, если честно. Вы хотите обратиться к переменной - члену базового класса напрямую по указателю на объект производного класса? Если да, то это можно сделать вот так:
    Код:
    class X
    {
        public:
            int x;
    };
    
    class D : public X
    {
    };
    
    D* pd = new D;
    int j = ( (X*)pd )->x;
    А лучше так:
    Код:
    int j = ( static_cast<X*>( pd ) )->x;
    А ещё лучше вообще такого не делать; подобный стиль программирования, в общем-то, чреват проблемами.

Последний раз редактировалось Максай; 03.06.2012 в 19:19.
Максай вне форума Ответить с цитированием
Старый 03.06.2012, 19:13   #3
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию

спасибо щас буду разбираться))
Тёма_) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ виртуальные функции iKarma Помощь студентам 2 28.11.2011 10:50
виртуальные функции vanek1 Помощь студентам 1 08.06.2011 17:49
ВИРТУАЛЬНЫЕ ФУНКЦИИ в Delphi MaxMad Помощь студентам 0 30.05.2010 20:06
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44
НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ С++ ermac52 Помощь студентам 1 05.06.2009 11:03