☆ 가상함수와 다형성
#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;
}
--
'기반지식 > C/C++' 카테고리의 다른 글
중앙정보학원 C/C++/OOP 강좌 16일차 - 2010년 6월 30일 (0) | 2010.06.30 |
---|---|
중앙정보학원 C/C++/OOP 강좌 15일차 - 2010년 6월 29일 (0) | 2010.06.30 |
중앙정보학원 C/C++/OOP 강좌 14일차 - 2010년 6월 28일 (0) | 2010.06.28 |
중앙정보학원 C/C++/OOP 강좌 13일차 - 2010년 6월 25일 (0) | 2010.06.25 |
중앙정보학원 C/C++/OOP 강좌 12일차 - 2010년 6월 24일 (0) | 2010.06.24 |