Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу наследование классов
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию наследование классов - 27.11.2011, 14:50

Добрый день!
Я начала писать примерный код программы:
разработать и реализовать базовый класс (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";}
};
Правильно ли я начала!И не могли бы вы подсказать,как реализовать методы...и переопределить какой-либо.
Ответить с цитированием
  (#2 (permalink)) Старый
Scorpion Scorpion вне форума
Member
 
Сообщений: 90
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2003
По умолчанию 28.11.2011, 10:49

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

cpp Код:
class Base
{
public:
    ....
    virtual void myFunction();
};

class Student
{
public:
    virtual void myFunction();
};

void Student::myFunction()
{
    cout << "my function" << endl;
}

Деструктор в базовом классе тоже следует сделать виртуальным.
Ответить с цитированием
  (#3 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 29.11.2011, 08:31

Цитата:
Сообщение от Scorpion Посмотреть сообщение
Для того, чтобы переопределить метод, надо в базовом классе объявить его виртуальным.
Не обязательно. Переопределить можно и не виртуальные методы.
Виртуализация нужна для других целей - чтобы методы базового класса могли использовать переопределенные методы потомка.
Ответить с цитированием
  (#4 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 29.11.2011, 11:17

А зачем у тебя Teacher и Head наследуют Base protected и private?
Ответить с цитированием
  (#5 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию 29.11.2011, 19:39

Я переписала код вот так:
Код:
# 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()
Только с главной функцией проблемы..
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Scorpion Scorpion вне форума
Member
 
Сообщений: 90
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2003
По умолчанию 05.12.2011, 18:28

Цитата:
Сообщение от Alexiski Посмотреть сообщение
Не обязательно. Переопределить можно и не виртуальные методы.
Можно-то можно, но только этого надо избегать.

Потому что иначе такой код будет работать неправильно:

cpp Код:
Base *b = new Derived;

b->OverridenFunction(); //Эта инструкция вызовет версию из базового класса, если мы не сделали функцию виртуальной.

Цитата:
Сообщение от Alexiski Посмотреть сообщение
Виртуализация нужна для других целей - чтобы методы базового класса могли использовать переопределенные методы потомка.
Нет.
Ответить с цитированием
  (#7 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию 08.12.2011, 13:32

Добрый день!!!
Вот код программы на наследование,необходимо сделать еще стек...
Код:
# 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");
}
Ответить с цитированием
  (#8 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 08.12.2011, 16:22

1. Стек чего ??
2. Что у тебя не получается? Приведи код.
Ответить с цитированием
  (#9 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию 08.12.2011, 17:29

Стек из элементов базового класса..Я просто туго представляю как с чего начать..
Ответить с цитированием
  (#10 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию 08.12.2011, 19:11

Вот я исправила в базовом классе:
Код:
Base()
{
	surname=new char [20];
	name=new char [20];
	age=0;
}
virtual void Print(){};
virtual void Input()=0;
virtual ~Base(){}
};
И примерно начала создавать класс стек:
Код:
class List
{
	Base* head;
public: 
	List()
	{
		head=NULL;
	}
	void Insert(Base*b)
...
Ответить с цитированием
  (#11 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию 10.12.2011, 14:38

Код:
class Stack
{
	Base*head;
public: 
	Stack()
	{
		head=NULL;
	}
 
 void Push(Base*val)
 {.....
Я создала класс стек,не могли вы помочь мне дальше описать функции и заполнить стек...
Ответить с цитированием
  (#12 (permalink)) Старый
milaxa milaxa вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.11.2011
По умолчанию 17.12.2011, 15:51

привет всем!
Из списка из лабораторной №5(наследование классов), выбрать объекты одного из производных типов и добавить их в контейнер vector стандартного класса из STL. Преобразовать контейнер vector в контейнер list или map, указав границы копирования с помощью итераторов. Применить ко второму контейнеру один из стандартных методов сортировки библиотеки STL.
код программы лабораторной 5:
Код:
#include <iostream>
#include <vector>
using namespace std;
class Base
{
protected:
	char * name;
	char * surname;
	int age;
public:
Base()
{
	surname=new char [20];
	name=new char [20];
	age=0;

}
virtual void Print(){};
virtual void Input(){};
 ~Base()
 {
	 delete name;
	 delete surname;
 }
};
class Student:public Base
{
private:
	int coorse,group;
	int rate;
public:
	Student()
	{
		coorse=0;
		group=0;
		rate=0;
		Input();
	}

~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:public Base
{
	char*post;
	float salary;
public:
Teacher()
{
	post=new char [20];
	salary=0;
	Input();
}
~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 = new char [20];
	Input();
	
}
~Head()
{
	delete name;
	delete surname;
	delete chair;
}
void Print()
{
	cout<<name<<","<<surname<<","<<chair<<","<<"возраст:"<<age<<endl;
	
}
void Input()
{
	cout<<"Введите имя заведующего кафедрой "<<endl;
	cin>>name;
	cout<<"Введите фамилию заведующего кафедрой "<<endl;
	cin>>surname;
	cout<<"Введите кафедру заведующего "<<endl;
	cin>>chair;
	cout<<"Введите возраст заведующего кафедрой "<<endl;
	cin>>age;
}
};
class Element
{
public:
	Base *d;
	Element*next;
};
class Stack
{
public:
	Element*top;
	Stack()
	{
		top=NULL;;
	}
	

	void Show()
{
	Element * temp = top;
	while (temp) 
	{
		temp->d->Print(); 
		temp=temp->next;
	}
}
	void Push(Base*b)
	{
		if(!top)
		{

			top=new Element();
			top->d=b;
		}
			if(top)
			{
				Element * temp=new Element();
				temp->d=b;	
				temp->next=top;
				top=temp;
			}
	}
	~Stack()
	{
		Element * temp;
		temp=top;
		while(temp)
		{
			delete temp;
			temp=top->next;
		}
	}
	};
	
void main()
{
	setlocale(LC_ALL, "Russian");
	Stack *S= new Stack();
	int k=1;
	while (k!=0)
	{
		cout<<"Введите 1-студент,2-преподаватель,3-заведующий кафедрой,0-выход \n";
		cin>>k;
		if (k==1)S->Push(new Student);
		if (k==2)S->Push(new Teacher);
		if (k==3)S->Push(new Head);
		if (k==0)S->Show();
	}
	
	system("pause");
}
Как и с чего начать???
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Vika_IM10 Vika_IM10 вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.12.2011
По умолчанию 18.12.2011, 19:12

Цитата:
Сообщение от milaxa Посмотреть сообщение
Код:
	void Push(Base*b)
	{
		if(!top)
		{

			top=new Element();
			top->d=b;
		}
			else if(top)
			{
				Element * temp=new Element();
				temp->d=b;	
				temp->next=top;
				top=temp;
			}
	}
Подправила немного. А то один объект (первый) создается два раза.
Ответить с цитированием
  (#14 (permalink)) Старый
Сыроежка Сыроежка вне форума
Member
 
Сообщений: 137
Сказал(а) спасибо: 0
Поблагодарили 17 раз(а) в 17 сообщениях
Регистрация: 16.11.2011
По умолчанию 19.12.2011, 01:31

Не смотря на все поправки, код функции Push() класса стек все равно некорректный. Поле next остается неинициализированным, когда создается первый элемент стека. А поэтому программа будет работать не корректно при ввыводе на экран элементов стека или при вызове деструктора стека.
Функция занесения элемента в стек должна выглядеть следующим образом:

cpp Код:
void Push( Base *b )
{
   Element *el = new Element();

   el->d = b;
   el->next = ( top ) ? top : 0;
   top = el;
}

Пардон, я был не внимателен! На самом деле поле next инициализируется нулем, когда вызывается конструктор в виде new Element(): в отличии от вызова конструктора без круглых скобок после его имени new Element;. В первом случае выполняется инициализация по значению, а во-втором инициализация по умолчанию. Так что код можно еще больше упростить!

cpp Код:
void Push( Base *b )
{
   Element *el = new Element();

   el->d = b;
   if ( top ) el->next = top;
   top = el;
}

Я специально сохранил первую часть своего комментария, так как это поучительно знать разницу между двумя различными вызовами конструктора.

Последний раз редактировалось Сыроежка; 19.12.2011 в 01:46
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс, наследование Хание Visual C++ 15 21.12.2011 02:36
шаблоны...наследование milaxa Задания за деньги 3 17.12.2011 16:32
Наследование и friend class Jonano С/С++ 6 15.10.2010 16:44
Наследование классов (Borland C++ ) Sorrat С/С++ 2 21.02.2009 14:37
Наследование, указатели, объекты D_K С/С++ 9 30.07.2008 20:05
Наследование и fk ykyk PostgreSQL 0 12.09.2007 11:25
Наследование и шаблоны infant С/С++ 7 17.02.2006 14:39
Множественное наследование Dian Мысли вслух 5 21.12.2005 18:30
Неправильное наследование wils0n С/С++ 4 15.11.2005 16:24
Наследование в C++ как устранить ошибки SkySp С/С++ 4 10.06.2005 00:42
Наследование и dynamic_cast Anonymous С/С++ 2 18.06.2003 18:58



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов