Наследование

  • Автор темы shocoladka
  • Дата начала
S

shocoladka

#1
Добрый лень!
Я начала писать примерный код программы:разработать и реализовать базовый класс (Base), объединяющий свойства перечисленных классов. Класс Base должен содержать не менее 2 полей и не менее 2 методов. Создать перечисленные классы как производные для базового класса (Base) с различным уровнем доступа, переопределить в них 1 метод базового класса. Объявить и описать собственные методы в производных классах. Продемонстрировать работу классов.
(студент, преподаватель, заведующий кафедрой.)
Код:
# include <iostream>
using namespace std;
class Base
{
public:
Base(){}
~Base(){}

string getSurname();
string getName();
void setSurname(string value);
void setName(string value);

private:
string name;
string surname;
};

class Student:public Base
{
public:
Student(){cout<<"конструктор Student\n";}
~Student(){cout<<"деструктор Student\n";}
};
class Teacher:protected Base
{
public:
Teacher(){cout<<"конструктор Teacher\n";}
~Teacher(){cout<<"деструктор Teacher\n";}
};
class Head:private Base
{
public:
Head(){cout<<"конструктор Head\n";}
~Head(){cout<<"деструктор Head\n";}
};
Можно узнать правильно ли я начала?И примерно,что дальше делать и как переопределить метод?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
И примерно,что дальше делать и как переопределить метод?
Ну во-первых тебе надо в базовом классе описать код функций, думаю можно оставить только get-функции.
Таким же образом опиши одну из функций в производных классах, с тем же именем, количеством возвращаемых и передаваемых параметров и их типами.
Например:
C++:
	class Base {
string A;
string B;
string getA() { return A; }
string getB() { return B; }
};

class A : public Base {
string A;
string getA() { return A; }	// метод getA() переопределен
};

...
И дальше по-аналогии.
 
S

shocoladka

#3
Я переписала программу вот так:
Код:
# include <iostream>
using namespace std;
class Base
{
protected:
char * name;
char * surname;
int age;
public:
Base()
{
name=NULL;
surname=NULL;
age-0;
}
~Base(){}

void Print(){}
void Input(){};
};

class Student:public Base
{
private:
int coorse,group;
int rate;
public:	Student()
{
coorse=0;
group=0;
rate=0;
}

~Student()
{
delete name;
delete surname;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
}
void Input()
{
cout<<"Введите имя студента "<<endl;
cin>>name;
cout<<"Введите фамилию студента "<<endl;
cin>>surname;
cout<<"Введите возраст студента "<<endl;
cin>>age;
cout<<"Введите курс студента"<<endl;
cin>>coorse;
cout<<"Введите группу студента"<<endl;
cin>>group;
cout<<"Введите группу студента"<<endl;
cin>>group;
cout<<"Введите рейтинг студента"<<endl;
cin>>rate;
}
};
class Teacher:public Base
{
char*post;
float salary;
public:
Teacher()
{
post=NULL;
salary=0;
}
~Teacher()
{
delete name;
delete surname;
delete post;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
}
void Input()
{
cout<<"Введите имя преподавателя "<<endl;
cin>>name;
cout<<"Введите фамилию преподавателя "<<endl;
cin>>surname;
cout<<"Введите возраст преподавателя "<<endl;
cin>>age;
cout<<"Введите должность преподавателя "<<endl;
cin>>post;
cout<<"Введите зарплату преподавателя"<<endl;
cin>>salary;

};
class Head:public Base
{
char*chair;


public:
Head()
{
chair=NULL;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<chair<<endl;
}
void Input()
{
cout<<"Введите имя заведующего кафедрой "<<endl;
cin>>name;
cout<<"Введите фамилию заведующего кафедрой "<<endl;
cin>>surname;
cout<<"Введите возраст заведующего кафедрой "<<endl;
cin>>age;
cout<<"Введите кафедру заведующего "<<endl;
cin>>chair;
{
delete name;
delete surname;
delete chair;
}

};
void main()
Только теперь не знаю что описывать в главной функции..
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
Зачем ты столько нагородила? Ошибок тьма. Сократи до минимума, зачем тебе делать больше чем указано в задании!?
 
S

shocoladka

#5
А что именно я ни так сделала?Я не понимаю...
 
R

rrrFer

#6
не вникал, но:
Код:
	cin>>chair;
{
delete name;
delete surname;
delete chair;
}
зачем эти фигурные скобки?

Добавлено: и чтобы в каждом наследнике не освобождать память из под полей суперкласса используй виртуальный деструктор

Добавлено:
Код:
Base()
{
name=NULL;
surname=NULL;
не нашел где память по указателям выделяется, но они используются:
Код:
cout<<"Введите имя заведующего кафедрой "<<endl;
cin>>name;
cout<<"Введите фамилию заведующего кафедрой "<<endl;
cin>>surname;
Добавлено:
Код:
Base()
{
name=NULL;
surname=NULL;
age-0;
}
что-то неведомое делаем с age
 
S

shocoladka

#7
Код:
# include <iostream>
using namespace std;
class Base
{
protected:
char * name;
char * surname;
int age;
public:
Base()
{
name=NULL;
surname=NULL;
age=0;
}
~Base(){}

void Print(){}
void Input(){};
};

class Student:public Base
{
private:
int coorse,group;
int rate;
public:	Student()
{
coorse=0;
group=0;
rate=0;
}

~Student()
{
delete name;
delete surname;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
}
void Input()
{
cout<<"Введите имя студента "<<endl;
cin>>name;
cout<<"Введите фамилию студента "<<endl;
cin>>surname;
cout<<"Введите возраст студента "<<endl;
cin>>age;
cout<<"Введите курс студента"<<endl;
cin>>coorse;
cout<<"Введите группу студента"<<endl;
cin>>group;
cout<<"Введите группу студента"<<endl;
cin>>group;
cout<<"Введите рейтинг студента"<<endl;
cin>>rate;
}
};
class Teacher:public Base
{
char*post;
float salary;
public:
Teacher()
{
post=NULL;
salary=0;
}
~Teacher()
{
delete name;
delete surname;
delete post;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
}
void Input()
{
cout<<"Введите имя преподавателя "<<endl;
cin>>name;
cout<<"Введите фамилию преподавателя "<<endl;
cin>>surname;
cout<<"Введите возраст преподавателя "<<endl;
cin>>age;
cout<<"Введите должность преподавателя "<<endl;
cin>>post;
cout<<"Введите зарплату преподавателя"<<endl;
cin>>salary;

};
class Head:public Base
{
char*chair;


public:
Head()
{
chair=NULL;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<chair<<endl;
}
void Input()
{
cout<<"Введите имя заведующего кафедрой "<<endl;
cin>>name;
cout<<"Введите фамилию заведующего кафедрой "<<endl;
cin>>surname;
cout<<"Введите возраст заведующего кафедрой "<<endl;
cin>>age;
cout<<"Введите кафедру заведующего "<<endl;
cin>>chair;
}
~ Head()
{
delete name;
delete surname;
delete chair;
}

};
void main()
Вот так..
 
S

shocoladka

#8
Код:
# include <iostream>
using namespace std;
class Base
{
protected:
char * name;
char * surname;
int age;
public:
Base()
{
surname=new char [20];
name=new char [20];
age=0;
}
~Base()
{
delete name;
delete surname;
}

void Print()
{
cout<<name<<" "<<surname<<"\n возвраст:"<<age<<endl;
}
void Input()
{
cout<<"введите фамилию, имя"<<endl;
cin>>surname>>name;
cout<<"введите возраст"<<endl;
cin>>age;
}
};
class Student:public Base
{
private:
int coorse,group;
int rate;
public:
Student()
{
coorse=0;
group=0;
rate=0;
}

~Student() 
{
delete name;
delete surname;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
}
void Input()
{
cout<<"Введите имя студента "<<endl;
cin>>name;
cout<<"Введите фамилию студента "<<endl;
cin>>surname;
cout<<"Введите возраст студента "<<endl;
cin>>age;
cout<<"Введите курс студента"<<endl;
cin>>coorse;
cout<<"Введите группу студента"<<endl;
cin>>group;
cout<<"Введите рейтинг студента"<<endl;
cin>>rate;
}
};
class Teacher:protected Base
{
char*post;
float salary;
public:
Teacher()
{
post=new char [20];
salary=0;
}
~Teacher()
{
delete name;
delete surname;
delete post;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
}
void Input()
{
cout<<"Введите имя преподавателя "<<endl;
cin>>name;
cout<<"Введите фамилию преподавателя "<<endl;
cin>>surname;
cout<<"Введите возраст преподавателя "<<endl;
cin>>age;
cout<<"Введите должность преподавателя "<<endl;
cin>>post;
cout<<"Введите зарплату преподавателя"<<endl;
cin>>salary;
}
};
class Head:private Base
{
char*chair;
public:
Head()
{
chair = new char [20];
}
~Head()
{
delete name;
delete surname;
delete chair;
}
void Print()
{
cout<<name<<","<<surname<<","<<chair<<endl;
cout<<"возраст"<<age<<endl;
}
void Input()
{
cout<<"Введите имя заведующего кафедрой "<<endl;
cin>>name;
cout<<"Введите фамилию заведующего кафедрой "<<endl;
cin>>surname;
cout<<"Введите кафедру заведующего "<<endl;
cin>>chair;
cout<<"Введите возраст заведующего кафедрой "<<endl;
cin>>age;
}
};
void main()
{
setlocale(LC_ALL, "Russian");
Base *a=new Base();
a->Input();
a->Print();
Student *b= new Student();
b->Input();
b->Print();
Teacher *c= new Teacher();
c->Input();
c->Print();
Head *d= new Head ();
d->Input();
d->Print();
system("pause");
}
Не могли б вы объяснить что значат вот эти строки в конструкторе:
Код:
Base()
{
surname=new char [20];
name=new char [20];
age=0;
}
зачем в деструкторе освобождать память:
Код:
~Base()
{
delete name;
delete surname;
}
Почему мы объявляем указатель:
Код:
		char * name;
char * surname;
Зачем в главной функции выделяем память:
Код:
Base *a=new Base();
 

lazybiz

Well-known member
03.11.2010
1 339
0
#9
Не могли б вы объяснить что значат вот эти строки в конструкторе:
1. Выделение памяти.
2. Выделение памяти.
3. Присвоение значения.

зачем в деструкторе освобождать память:
Ну как зачем?! Допустим. Представь такую ситуацию: ты взяла у меня в долг 10000 рублей, если ты мне их не отдашь, то это будет не по-человечески! Долги надо возвращать! Так же и память, которую ты взяла в конструкторе.

Почему мы объявляем указатель:
Потому что в переменную типа char ты можешь записать только один символ, а указателю можно присвоить адрес строки произвольной длины в памяти компьютера.

Зачем в главной функции выделяем память:
Не знаю. Кому как нравится. Можно обойтись и без этого, например вот так:
C++:
	...
Base	a;
a.Input();
...
a.Print();
...
А вообще, учи матчасть!
 
S

shocoladka

#10
Добрый лень!
Я написала код программы:разработать и реализовать базовый класс (Base), объединяющий свойства перечисленных классов. Класс Base должен содержать не менее 2 полей и не менее 2 методов. Создать перечисленные классы как производные для базового класса (Base) с различным уровнем доступа, переопределить в них 1 метод базового класса. Объявить и описать собственные методы в производных классах. Продемонстрировать работу классов.
(студент, преподаватель, заведующий кафедрой.)Теперь необходимо сделать функции виртуальными и создать стек..
Код:
# include <iostream>
using namespace std;
class Base
{
protected:
char * name;
char * surname;
int age;
public:
Base()
{
surname=new char [20];
name=new char [20];
age=0;
}

~Base()
{
delete name;
delete surname;
}

void Print()
{
cout<<name<<" "<<surname<<"\n возвраст:"<<age<<endl;
}
void Input()
{
cout<<"введите фамилию, имя"<<endl;
cin>>surname>>name;
cout<<"введите возраст"<<endl;
cin>>age;
}
};
class Student:public Base
{
private:
int coorse,group;
int rate;
public:
Student()
{
coorse=0;
group=0;
rate=0;
}

~Student() 
{
delete name;
delete surname;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
}
void Input()
{
cout<<"Введите имя студента "<<endl;
cin>>name;
cout<<"Введите фамилию студента "<<endl;
cin>>surname;
cout<<"Введите возраст студента "<<endl;
cin>>age;
cout<<"Введите курс студента"<<endl;
cin>>coorse;
cout<<"Введите группу студента"<<endl;
cin>>group;
cout<<"Введите рейтинг студента"<<endl;
cin>>rate;
}
};
class Teacher:protected Base
{
char*post;
float salary;
public:
Teacher()
{
post=new char [20];
salary=0;
}
~Teacher()
{
delete name;
delete surname;
delete post;
}
void Print()
{
cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
}
void Input()
{
cout<<"Введите имя преподавателя: "<<endl;
cin>>name;
cout<<"Введите фамилию преподавателя: "<<endl;
cin>>surname;
cout<<"Введите возраст преподавателя: "<<endl;
cin>>age;
cout<<"Введите должность преподавателя: "<<endl;
cin>>post;
cout<<"Введите зарплату преподавателя:"<<endl;
cin>>salary;
}
};
class Head:private Base
{
char*chair;
public:
Head()
{
chair = new char [20];
}
~Head()
{
delete name;
delete surname;
delete chair;
}
void Print()
{
cout<<name<<","<<surname<<","<<chair<<endl;
cout<<"возраст"<<age<<endl;
}
void Input()
{
cout<<"Введите имя заведующего кафедрой "<<endl;
cin>>name;
cout<<"Введите фамилию заведующего кафедрой "<<endl;
cin>>surname;
cout<<"Введите кафедру заведующего "<<endl;
cin>>chair;
cout<<"Введите возраст заведующего кафедрой "<<endl;
cin>>age;
}
};

void main()
{
setlocale(LC_ALL, "Russian");
Base *a=new Base();
a->Input();
a->Print();
Student *b= new Student();
b->Input();
b->Print();
Teacher *c= new Teacher();
c->Input();
c->Print();
Head *d= new Head ();
d->Input();
d->Print();
system("pause");
}