|
|
Employee - базов клас,
Manager
-
производен клас
- членовете на базовият клас са членове и на производния клас;
- функциите на производният клас нямат достъп до частните членове
на базовия клас
Дефиниции на функции от производния
клас.
Конструкторът на производния клас има две задачи:
- да инициализира полетата с данни;
- да инициализира обекта от базовия клас, който се съдържа в
производния клас..
Manager::Manager(string n, double
sal, string dept)
: Employee(n, sal)
{ department = dept; }
Ако в базовия и в производния класове има функции
с едно и също име, то викането на член-функция на базовия клас от функция
на производния клас става с помощта на операция "принадлежност към клас"
- ::
void Manager::print()
{ Employee::print();
cout << department;
}
// clocks.cpp
#include "ccc_win.cpp"
#include "ccc_time.cpp"
const double PI = 3.141592653589793;
class Clock {
public:
Clock() {}
Clock(Point c, double r){
center = c; radius = r; }
void set_time(Time t){ current_time
= t; }
void draw() const;
private:
void draw_tick(double angle,
double length) const;
void draw_hand(double angle,
double length) const;
Time current_time;
Point center;
double radius;
};
void Clock::draw_tick(double angle, double
length) const
{ double alpha = PI/2 - 6*angle*PI/180;
Point from(center.get_x() + cos(alpha)*radius*(1-length),
center.get_y() + sin(alpha)*radius*(1-length));
Point to(center.get_x() + cos(alpha)*radius,
center.get_y() + sin(alpha)*radius);
cwin << Line(from, to);
}
void Clock::draw_hand(double angle, double
length) const
{ double alpha = PI/2 - 6*angle*PI/180;
Point from = center;
Point to(center.get_x() + cos(alpha)*radius*length,
center.get_y() + sin(alpha)*radius*length);
cwin << Line(from, to);
}
void Clock::draw() const
{ cwin << Circle(center, radius);
const double HOUR_TICK = 0.2;
const double MINUTE_TICK = 0.1;
const double HOUR_HAND = 0.6;
const double MINUTE_HAND = 0.75;
for (int i = 0; i < 12; i++)
{ draw_tick(i * 5, HOUR_TICK);
for (int j = 1; j <=
4; j++) draw_tick(i*5 + j, MINUTE_TICK);
}
draw_hand(current_time.get_minutes(),
MINUTE_HAND);
draw_hand((current_time.get_hours()
+
current_time.get_minutes()/60.0)*5,
HOUR_HAND);
}
class WorldClock : public Clock {
public:
WorldClock() {}
WorldClock(string city_name,
double hour_diff, Point center, double radius);
void draw() const { Clock::draw();
cwin << city; }
private:
Message city;
};
WorldClock::WorldClock(string city_name,
double hour_diff, Point center, double radius) : Clock(center, radius)
{ Point p = center;
p.move(0, -radius);
city = Message(p, city_name);
Time now;
const double SECONDS_PER_HOUR =
60 * 60;
now.add_seconds(hour_diff * SECONDS_PER_HOUR);
set_time(now);
}
int main()
{ vector<WorldClock> clocks(6);
clocks[0] = WorldClock("San Jose",
16, Point(-6.5, 5), 3);
clocks[1] = WorldClock("Taipei",
7, Point(0, 5), 3);
clocks[2] = WorldClock("Berlin",
1, Point(6.5, 5), 3);
clocks[3] = WorldClock("Cairo",
2, Point(-6.5, -5), 3);
clocks[4] = WorldClock("New York",
19, Point(0, -5), 3);
clocks[5] = WorldClock("Bombay",
4.5, Point(6.5, -5), 3);
for (int i = 0; i < clocks.size();
i++) clocks[i].draw();
return 0;
}