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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2009, 12:17   #1
Наташенька
Пользователь
 
Аватар для Наташенька
 
Регистрация: 20.12.2008
Сообщений: 26
По умолчанию Базовый и производный классы!

Здравствуйте! Выполняю работу - определяю базовый класс Student и производный Student_Matfaca:

Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
class Student
{protected:
int kurs, year;
char surename[20];
public: 
Student(int k=0,int y=0, char *S=0)
{if (proverka(k,y) == false) 
	{cout<<"<error>"<<endl;
	exit(0);} 
else
{kurs=k;
year=y;
strcpy(surename,S);
}}

static bool proverka(int k, int y) {
		 if ((k<1) || (k>5)) return false;
		 if (y<1) return false;
		 return true;
	 }
~Student(){cout<<"bazovuj class"<<endl;}
 int get_kurs()const {return kurs;}
 int get_year()const {return year;}
 char get_surename() {return *surename;}

 virtual void print(){cout<<"Kurs: "<<kurs<<endl<<"God postupleniya: "
	 <<year<<endl<<"Familiya studenta: "
	 <<surename<<endl;}
};
class Student_Matfaca:public Student
{private:
char kafedra[20];
public:
	Student_Matfaca (int k, int y, char *S, char *K=0):
Student(k, y, S)
{
	if(K==0){}
	else
	{strcpy(kafedra, K);}
}

~Student_Matfaca(){cout<<"proizvodnyj class"<<endl;}
virtual void print()
{Student::print();
cout<<"Kafedra "<<kafedra<<endl<<endl;}
};
void PRINT(Student_Matfaca *R)
{for(int i=0; i<2; i++)
{R[i].print();
cout<<endl<<endl;}}



void main()
{
Student std1(1,2008,"Zueva");
Student std2(1,2008,"Valyanova");
Student_Matfaca std3(3,6,"Ivanov","teorii funkcii");
//std3.print();
//cout<<std2.get_surename();
std2.print();
Student_Matfaca *ptr1=&std1;//Oshibka
Student_Matfaca *ptr2=&std2;//Oshibka
Student_Matfaca R[]={*ptr1, *ptr2};

PRINT(R);
}

Не получается указателю присвоить ссылку на объект
Компилятор пишет: Error 3 error C2440: 'initializing' : cannot convert from 'Student *__w64 ' to 'Student_Matfaca *'

Пожалуйста скажите, как сделать так, чтобы использовался именно производный класс Student_Matfaca!

Последний раз редактировалось Наташенька; 21.05.2009 в 12:19.
Наташенька вне форума Ответить с цитированием
Старый 21.05.2009, 12:49   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Никак. Вы создаёте студента, а хотите с ним работать как со студентом мат фака. Обычно наоборот делают:
Код:
Student_Matfaca std1(1,2008,"Zueva");
...
Student *ptr1=&std1;
...
pu4koff вне форума Ответить с цитированием
Старый 21.05.2009, 14:05   #3
Наташенька
Пользователь
 
Аватар для Наташенька
 
Регистрация: 20.12.2008
Сообщений: 26
По умолчанию

То есть в функцию PRINT надо передавать массив элементов базового класса Student т. е.
Код:
Student R[]={*ptr3,
и
Код:
Student_Matfaca std3(3,6,"Ivanov","teorii funkcii");
Student *ptr3=&std3;
Получается мы будем работать с объектами производного класса как с объектами базового? А в печать они будут выводиться только как объекты базового!
Наташенька вне форума Ответить с цитированием
Старый 21.05.2009, 14:16   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Наташенька Посмотреть сообщение
То есть в функцию PRINT надо передавать массив элементов базового класса Student т. е.
Код:
Student R[]={*ptr3,
Лучше Student* R[]={ptr3,...};
А то будет фигня в итоге.
Цитата:
Сообщение от Наташенька Посмотреть сообщение
Получается мы будем работать с объектами производного класса как с объектами базового?
Да. В том и фишка наследования в ООП
Цитата:
Сообщение от Наташенька Посмотреть сообщение
А в печать они будут выводиться только как объекты базового!
Нет. Чтобы так не было, у Вас и объявлен метод print как виртуальный. Так что всё будет нормально в этом плане.
pu4koff вне форума Ответить с цитированием
Старый 21.05.2009, 15:21   #5
Наташенька
Пользователь
 
Аватар для Наташенька
 
Регистрация: 20.12.2008
Сообщений: 26
По умолчанию

А у меня не получается печатать как производного! В массиве же объекты базового класса?!
Наташенька вне форума Ответить с цитированием
Старый 21.05.2009, 16:11   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Массив указателей надо заводить. Иначе у Вас копирование объектов происходит, которое к тому же не перегружено. Пробуйте так:
Код:
void PRINT(Student **R, int count)
{
  for(int i = 0; i< count; ++i)
  {
    R[i]->print();
    cout << endl << endl;
  }
}
...
Student std1(1,2008,"Zueva");
Student std2(1,2008,"Valyanova");
Student_Matfaca std3(3,6,"Ivanov","teorii funkcii");
...
Student* R[]={&std1, &std2, &std3};
PRINT(R, 3);
pu4koff вне форума Ответить с цитированием
Старый 21.05.2009, 16:24   #7
Наташенька
Пользователь
 
Аватар для Наташенька
 
Регистрация: 20.12.2008
Сообщений: 26
По умолчанию

Урр-р-раааааа!!! Заработала! Вы мне так помогли! Я очень вам благодарна! :*
Наташенька вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы в С++ S2S Общие вопросы C/C++ 0 15.03.2009 13:25
Классы С++ kims Общие вопросы C/C++ 2 05.03.2009 00:45
Классы Викдон Общие вопросы C/C++ 3 04.03.2009 23:07
Вернут указатель на базовый класс Crucian Общие вопросы C/C++ 2 08.11.2007 18:10