Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Виртуальная функция


Автор: FightInGlory 2.11.2009, 18:12
Дана задача:

 У клиента есть бассейн. Бассейн должна окружать бетонная дорожка и вся территория бассейна должна быть ограждена. Клиент хочет определить затраты, связанные с постройкой дорожки вокруг бассейна и сооружением ограды бассейна.
Клиент задает:
- стоимость бетонирования($0.5 за кв.м.)
- стоимость ограды($3.5 за кв.м.)
- ширину дорожки
- радиус бассейна.

использовать виртуальные функции

Я написал, но не в виде виртуальной функции, помогите сделать виртуальную. Желательно объяснить как да чего. или дайте линк, на что-то подобное. 
Мои деревянные попытки чет сделать, ниже.

Код

float radius, shirina;
float p = 3.14, s1,s2,s3,p1, dorojka, ograda;

cout << "Vvedite radius kruga v metrah: ";
cin >> radius;
cout << "Vvedite 6irinu v metrah: ";
cin >> shirina;

s1 = p*radius*radius;
s2 = p*(shirina+radius)*(shirina+radius);
s3 = s2-s1;
p1 = 2*p*(shirina+radius);

ograda = p1*3.5;
dorojka = s3*0.5;

cout << "plo6ad': " << s3 << endl;
cout << dorojka << endl;
cout << "perimetr: "<< p1 << endl;
cout << ograda << endl;


Код

float radius, shirina;
float p = 3.14, s1, s2, s3, p1, dorojka, ograda;

class Vvod
{
   public:Vvod()
   {
      cout << "Vvedite radius kruga v metrah: ";
      cin >> radius;
      cout << "Vvedite 6irinu v metrah: ";
      cin >> shirina;
   }
}

class podschet
{
   public:podchet()
   {
       s1 = p*radius*radius;
       s2 = p*(shirina+radius)*(shirina+radius);
       s3 = s2-s1;
       p1 = 2*p*(shirina+radius);

       ograda = p1*3.5;
       dorojka = s3*0.5;
   }
}

class Vyvod:public podscjet:public Vvod
{
   public:Vyvod()
   {
        cout << "plo6ad': " << s3 << endl;
        cout << dorojka << endl;
        cout << "perimetr: "<< p1 << endl;
        cout << ograda << endl;
   }
}

Автор: bsa 2.11.2009, 19:08
Сделай класс "изделие", у которого будет виртуальный метод cost, который будет возвращать цену. Затем сделай наследников Ograda и Dorozhka, которые подменят этот метод. Результат можно будет посчитать так: ograda.cost() + dorozhka.cost().

Автор: FightInGlory 2.11.2009, 19:10
Если тебя не затруднит, приведи какой-то пример. Даже очень простой. Я много че листал и читал. Никак не разберусь.

Автор: Anikmar 2.11.2009, 19:20
Цитата(FightInGlory @  2.11.2009,  18:12 Найти цитируемый пост)
- стоимость ограды($3.5 за кв.м.)

Тогда нужна еще высота ограды? или там за погонный метр

Автор: FightInGlory 2.11.2009, 20:14
Как я понял, погонный метр)))

Автор: Anikmar 3.11.2009, 00:44
Цитата(FightInGlory @  2.11.2009,  20:14 Найти цитируемый пост)
Как я понял, погонный метр))) 

Странно...

В общем примерно так можно действовать (набросок)

Код

#include <cstdlib>
#include <iostream>

using namespace std;

class BaseUnit
{
public:
    float GetCost(void) { return GetCount() * Price; };
    virtual float GetCount(void);
    float Radius;        
    float Price;
};

class Road : public BaseUnit
{
public:
    virtual float GetCount(void) { return ... // Вернуть площадь дорожки };
    float Width;
};

class Wall : public BaseUnit
{
    virtual float GetCount(void) { return ... // Вернуть длину ограды };
};


int main(int argc, char *argv[])
{
    Road oRoad;
    Wall oWall;
    
    // вводим исходные данные    
    
    // Стоимость ограды - oWall.GetCost();
    // Стоимость дорожки = oRoad.GetCost();
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)