기반지식/C/C++2010. 7. 1. 19:54
☆ 가상함수와 다형성

#include <iostream.h>
#include <string.h>

class Com
{
public:
virtual void draw()  //<-- 부모 클래스 Com의 원래 함수 draw()를 virtual로 가상함수로 만든다
{
cout << "Com-draw\n";
}
};

/////////////////////////////////////////////////

class Circle:public Com  // <-- 부모 클래스 Com으로부터 상속받음
{
public:
void draw()           // <-- draw() 함수를 원을 그리는 데에 사용한다
{
cout << "원을 그린다\n";
}
};

/////////////////////////////////////////////////

class Rect:public Com   // <-- 부모 클래스 Com으로부터 상속받음
{
public:
void draw()          // <-- draw() 함수를 사각형을 그리는 데에 사용한다
{
cout << "사각형을 그린다\n";
}
};

/////////////////////////////////////////////////

void main()
{
Com *p;
int n;
while(1)
{
cout << "1. Circle  2. Rect  3. Exit\n";
cin >> n;
switch(n)
{
case 1:
p = new Circle();
break;
case 2:
p = new Rect();
break;
default:
return;
}
p->draw();
}
}

  - 순수 가상함수가 포함되어 있는 클래스를 추상(abstract) 클래스라 한다. 
  - 추상 클래스로부터 상속받은 클래스는 반드시 순수 가상함수를 오버라이딩해야 한다. 
  

☆ 예제 2

#include <iostream.h>

class Command
{
public:
virtual void write() = 0;  // 순수 가상 함수
};

////////////////////////////////////////////

class List:public Command
{
void write()
{
cout << "게시판 목록을 출력합니다 \n";
}
};

////////////////////////////////////////////

class Insert:public Command
{
void write()
{
cout << "게시판에 글을 올립니다\n";
}
};

/////////////////////////////////////////////

class Edit:public Command
{
void write()
{
cout << "게시판의 글을 수정합니다\n";
}
};

///////////////////////////////////////////////

/////////////////////////////////////////////

class Delete:public Command
{
void write()
{
cout << "게시판의 글을 삭제합니다\n";
}
};

///////////////////////////////////////////////

void main()
{
int n;
Command *p;

while(1)
{
cout << "1. 추가  2. 삭제  3. 수정  4. 출력  5. 종료\n";
cin >> n;

switch(n)
{
case 1:
p = new Insert;
break;

case 2:
p = new Delete;
break;

case 3:
p = new Edit;
break;

case 4:
p = new List;
break;

default:
return;
}
p->write();
}
}

  - 

☆ 파일 입출력

#include <stdio.h>

void main()
{
        FILE *fp = fopen("c:\\data1.txt", "w"); // w : 쓰기 모드로 파일을 연다. 
                                                                          파일이 없으면 새로 만들고, 있어도 새로 만들어 덮어쓴다.

putc('A', fp);  // putc : 파일에 한글자 출력
putc('B', fp);

fclose(fp);

puts("탐색기에서 확인하세요");
int n;
FILE *fp;

char ch;
while(1)
{
puts("1. 문자 입력 후 Ctrl+Z  2. 파일출력  3. 종료");
scanf("%d", &n);

switch(n)
{
case 1:
fp = fopen("c:\\paper.txt", "a"); // 추가 모드로 파일 열기.
while(1)
{
if((ch=getchar())==EOF)
{
fprintf(fp, "======================\n");   
break;
}
fputc(ch, fp);      // 키보드에서 한글자를 입력받아 파일에 기록.
}
fclose(fp);
break;

case 2:
fp = fopen("c:\\paper.txt", "r"); // 읽기 모드로 파일 열기.
puts("=== paper.txt 파일 읽기 ===");

while(!feof(fp))       // feof : 파일의 끝인가를 검사한다.
{
ch = fgetc(fp);
putchar(ch);
}
puts("\n=== paper.txt 파일 읽기 끝 ===");
fclose(fp);
break;

default:
puts("탐색기에서 파일을 확인하세요");
return;
}
}
}


☆ 파일 입출력(구조체를 사용하는 방법)

#include <iostream>
#include <fstream>

using namespace std;

struct data
{
char name[20];
int age;
char address[20];
};

/*
int main()                                // 파일에 쓰는 부분
{
data man[5]={
{"박문석", 50, "서울"},
{"이순신", 40, "아산"},
{"김유신", 55, "대구"},
{"강감찬", 34, "서울"},
{"을지문덕", 25, "마산"}
};

ofstream fout;

fout.open("c:\\data.txt");
fout.write((char *)man, sizeof(data)*5);
fout.close();

return 0;
}
*/

int main()                         // 파일로부터 읽어오기
{
data man;
ifstream fin;
fin.open("c:\\data.txt");
if(fin.fail())
{
printf("Error: file open error\n");
return 0;
}

cout << " *** 파일에서 읽어온 데이터 ***\n";
cout << "-------------------------------\n";
cout << "이름 나이 주소\n";
cout << "-------------------------------\n";

while(fin.read((char *) &man, sizeof(man)) )
{
cout << man.name << " " << man.age << " " << man.address << endl;
}

fin.close();
return 0;
}

--
Posted by windship