класс и производный класс.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Нужно: создать класс Liquid (жидкость), содержащий поля название и плотность.Определить методы переназначения и изменения плотности. Создать производный класс Alcohol(спирт), имеющий крепость.
Определить методы переназначения и изменения крепости.

Правильно ли я сделал и понял задание?

--- 1 вариант реализации---

Код: Выделить всё

class Liquid
{
private:
	char name[22];
	float density;
public:
	void GetName(char *a) {strcpy(name, a);}
    void GetDenisty (float a) {density = a;}
	void DensityChange(float new_a);
};
class Alcohol :p ublic Liquid
{
private:
	float fortress;
public:
	void GetFortress(float b){fortress=b;}
	void FortressChange(float new_b);
};
void Liquid: :D ensityChange(float new_a)
{
	density=new_a;
}
void Alcohol::FortressChange(float new_b)
{
	fortress=new_b;
}

void main()
{
	Alcohol obj;
	obj.GetName("zhenya");
	obj.GetDenisty(1000);
	obj.GetFortress(13);
	system("PAUSE");
}
--- 2 вариант---
//он еще и не работает почемуто :(

Код: Выделить всё

class Liquid
{
public:
        virtual void GetName();
        virtual float GetDen();
protected:
        char name[22];
        float density;
};
        class Alcohol :p ublic Liquid
{ 
public:
        virtual void GetName(char *a) {strcpy(name,a);}
        virtual float GetDen(float b) {density=b;return density;}
};
void main()
{
	Alcohol obj;
	obj.GetName("zhenya");
	obj.GetDen(14);
	system("PAUSE");
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Если уж метод начинается со слова Get, то, обычно, ожидается получение каких-то данных, а если метод пытается изменить поля класса, то, называться он должен по другому, например: SetName, SetDensity и т.д. Строка obj.GetName("zhenya"); понимается как "получить имя zhenya", а не "установить имя zhenya", что метод и делает. Конечно, твоё личное дело как обзывать методы, но другим разбираться тяжело. В первом варианте базовый класс защищает свои поля приватной секцией, значит наследник напрямую не сможет обратиться к полям name и density, а методы есть только изменяющие, т.е. прочитать что там находится невозможно. Во втором случае name и density доступны наследнику, но отсутствует поле крепости у класса Alcohol.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Почему во втором варианте у меня ошибки, вида: 2 неразрешенных параметра.
2 вариатн:

Код: Выделить всё

class Liquid
{
public:
        virtual void setName();
        virtual float setDen();
protected:
        char name[22];
        float density;
};
        class Alcohol :p ublic Liquid
{ 
private:
	float fortress;
public:
        virtual void setName(char *n) {strcpy(name,n);}
        virtual float setDen(float a) {density=a;return density;}
		void setFort(float b) {fortress=b;}
};
void main()
{
	Alcohol obj;
	obj.setName("zhenya");
	obj.setDen(14);
	obj.setFort(2);
	system("PAUSE");
}
В первом варианте базовый класс защищает свои поля приватной секцией, значит наследник напрямую не сможет обратиться к полям name и density, а методы есть только изменяющие, т.е. прочитать что там находится невозможно.
Т.е. нужно создать метод выводы полей name and density в базовом классе?
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Евгений Александрович писал(а):Почему во втором варианте у меня ошибки, вида: 2 неразрешенных параметра.
Добавь реализацию методов в базовый класс
Евгений Александрович писал(а):Т.е. нужно создать метод выводы полей name and density в базовом классе?
Скорее не вывода, а получение копий.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Добавь реализацию методов в базовый класс
Спасибо, помогло.
Скорее не вывода, а получение копий.
Что это вообще такое :) Не могли бы Вы пояснить как это делается?
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Евгений Александрович писал(а): Не могли бы Вы пояснить как это делается?

Код: Выделить всё

float getDen()
{
return density;
}
Вот так можно получить копию density, даже если density находится в приватной секции.
Ответить