1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным.
В описании темы указываем язык!!!
#include <iostream.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #include <graphics.h> #include <string.h> #include <math.h> void move(int i); // è½áßß öêâôÉÇ class Figure { protected: int Color; int CenterX; int CenterY; public: Figure(int iCenterX, int iCenterY) { Color = RED; CenterX = iCenterX; CenterY = iCenterY; } void SetNewColor(int NewColor) { Hide(); Color=NewColor; Show(); } virtual void Show() = 0; virtual void Hide() { int prev_col = Color; Color=getbkcolor(); Show(); Color = prev_col; } void Move(int DeltaX, int DeltaY) { Hide(); CenterX+=DeltaX; CenterY+=DeltaY; Show(); } virtual ~Figure() {}; };
class Butterfly: public Figure { private: int Radius; int RadiusX; int RadiusY; int Stangle; int Endangle; public: Butterfly(int iCenterX, int iCenterY, int iStangle,int iEndangle,int iRadiusX,int iRadiusY,int iRadius) : Figure(iCenterX, iCenterY) { Stangle=iStangle; Endangle=iEndangle; Radius=iRadius; RadiusX = iRadiusX; RadiusY = iRadiusY; } void Show(); };
class Hexe: public Figure { private: int RRadius; int rRadius; public: Hexe(int iCenterX, int iCenterY, int iRadius) : Figure(iCenterX, iCenterY) { RRadius = iRadius; rRadius = (sqrt(3)/2)*RRadius; } void Show(); };
int main() { int n_menu; while (1) { clrscr; cout<<"1-Butterfly\n2-Hexe\n3-Combo\n4-Exit\n"; cin>>n_menu; int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "../BGI"); errorcode = graphresult(); if (errorcode != grOk) { cerr<<"Graphics error"; cerr<<grapherrormsg(errorcode); exit(1); } Butterfly F1(100,100,0,360,20,75,100); Hexe F2(100,100,100); Combo F3(100,100,0,360,20,75,100); switch(n_menu) { case 1: cleardevice();F1.Show();break; case 2: cleardevice();F2.Show();break; case 3: cleardevice();F3.Show();break; case 4: cout<<"Bay! Bay!\n";delay(750);return 0; } getch(); int maxcolor = getmaxcolor(); int direction = 1; for (int color = 0; !kbhit(); color++) { if (color>maxcolor) {color=0; direction*=-1;}
switch (n_menu) { case 1: F1.SetNewColor(color);F1.Move(10*direction,10*direction);break; case 2: F2.SetNewColor(color);F2.Move(10*direction,10*direction);break; case 3: F3.SetNewColor(color);F3.Move(direction);break; } delay(50); } closegraph(); } }
По меню по очереди можно вывести бабочку, потом шестиугольник правильный, потом комбинированно бабочку в шестиугольнике. Бабочки и шестиугольник наследники от общего класса фигуры, а вот комбо от бабочки и шестиугольника. Не пойму вот следующее по идее класс Combo должен ведь унаследовать методы Move и SetNewColor, так как он наследник от Butterfly и Hex, которые в свою очередь наследуют данный метод от Figure. Но если выкинуть эти методы как сделано в выше представленном коде и напрямую обращаться например F3.SetNewColor(color);F3.Move(10*direction,10*direction); естественно компилятор материться. Так как правильно оформить наследственность и добраться до данных методов, не прописывая их в классе Combo и естественно не описывая так
т.е. на всякий случай лучше всегда делать виртуальное наследование?
На всякий случай надо знать об этом подводном камешке. И поступать так, как тебе нужно для решения задачи. Иногда (правда редко) нужно, чтобы при множественном наследовании базовый класс инициализировался при инициализации каждого потомка, иногда (чаще всего) не нужно. Поэтому, если ты будешь знать эту особенность - сможешь делать так, как нужно в твоем случае...