130823.14일차

|

#include "130823.h"


/*

class Father

{

protected : 

int kor;

public : 

Father( int kor=0 );

void disp();

};

Father::Father( int kor ) {

this->kor = kor; 

}

void Father::disp() {

printf("국어 : %d\n", kor);

}




class Son : public Father

{

int eng;

public : 

Son(int kor=0, int eng=0);

void disp();

void dispAll();

};

Son::Son( int kor, int eng ) : Father( kor ) {

this->eng = eng;

}

void Son::disp() {

printf("영어 : %d\n", eng);

}

void Son::dispAll() {

printf("국어 : %d\n", kor);

printf("영어 : %d\n", eng);

}



void main()

{

Father * fa;

Son * so;



// 부모 클래스 객체 포인터 변수 = 부모 클래스 객체

fa = new Son( 20 );

fa->disp(); // 20

//fa->dispAll();


delete fa;


// 자식 클래스 객체 포인터 변수 = 자식 클래스 객체

so = new Son( 30, 40);

so->Father::disp(); // 30

so->disp(); // 40

delete so;


// 부모 클래스 객체 포인터 변수 = 자식 클래스 객체

fa = new Son(50,60); // 자동 형변환

fa->disp();

//fa->disAll();

delete fa;


// 자식 클래스 객체 포인터 변수 = 부모 클래스 객체

//so = new Father( 80 ); // 잘라서 넣으면 가능. 

so =(Son*) new Father( 80 ); // 강제 형변환

so->Father::disp();


delete so;


}



*/





// 함수 포인터

/*

double hap( int a, int b );

double cha( int a, int b );

double gop( int a, int b );

double mok( int a, int b );

void main()

{

int a=5, b=2;



// 함수를 이름으로 접근

printf("합 : %.2lf\n", hap(a,b) );

printf("차 : %.2lf\n", cha(a,b) );

printf("곱 : %.2lf\n", gop(a,b) );

printf("몫 : %.2lf\n", mok(a,b) );


printf("\n");

//함수를 포인터로 접근

double (*ap)( int , int );

ap = &hap; // ap = hap 이렇게 해도되고 안해도됨

printf("합 : %.2lf\n",(*ap)(a,b) );


//함수 포인터를 쓰면 간단해진다


ap = &cha;

printf("차 : %.2lf\n",(*ap)(a,b) );


ap = &gop; 

printf("곱 : %.2lf\n",(*ap)(a,b) );


ap = &mok; 

printf("몫 : %.2lf\n",(*ap)(a,b) );



}



double hap( int a, int b ) {

return (double)a+b;

}

double cha( int a, int b ) {

return (double)a-b;

}

double gop( int a, int b ) {

return (double)a*b;

}

double mok( int a, int b ) {

return (double)a/b;

}

*/





// 멤버 함수 포인터


/*

class Calc

{

int a, b;

public : 

Calc( int a=0, int b=0 );

int hap();

int cha();

int gop();

double mok();

};


Calc::Calc( int a, int b){

this->a=a;

this->b=b;

}

int Calc::hap() {

return a+b;

}

int Calc::cha() {

return a-b;

}

int Calc::gop() {

return a*b;

}

double Calc::mok() {

return (double)a/b;

}





void main() {

Calc c(5,2);

// 멤버함수를 이름으로 접근

printf("합 : %d\n", c.hap() );

printf("차 : %d\n", c.cha() );

printf("곱 : %d\n", c.gop() );

printf("몫 : %.2lf\n", c.mok() );

printf("\n");


// 멤버함수를 포인터로 접근

int (Calc::*ap)();

double (Calc::*bp)();

ap = &Calc::hap;

printf("합 : %d\n", (c.*ap)() );

ap = &Calc::cha;

printf("차 : %d\n", (c.*ap)() );

ap = &Calc::gop;

printf("곱 : %d\n", (c.*ap)() );

bp = &Calc::mok;

printf("몫 : %.2lf\n", (c.*bp)() );


printf("\n");



Calc * cp = new Calc(7,3);

printf("합 : %d\n", cp->hap() );

printf("차 : %d\n", cp->cha() );

printf("곱 : %d\n", cp->gop() );

printf("몫 : %.2lf\n", cp->mok() );

printf("\n");


ap = &Calc::hap;

printf("합 : %d\n", (cp->*ap)() );

ap = &Calc::cha;

printf("차 : %d\n", (cp->*ap)() );

ap = &Calc::gop;

printf("곱 : %d\n", (cp->*ap)() );

ap = &Calc::mok;

printf("몫 : %.2lf\n",(cp->*ap)() );


}


*/






// 멤버함수 포인터를 이용한 자식 클래스 멤버 접근 

/*

class Name

{

char name[12];

public : 

Name( char * nema = "no" );

void dispName();


void disp( Name * np, void (Name::*ap)() );


void disp( void (Name::*ap)() );

};

Name::Name( char * name )  {

//this->name = new char[strlen(name)+1];

strcpy( this->name , name );

}

void Name::dispName() {

printf("이름 : %s\n", name);

}

void Name::disp( Name * np, void (Name::*ap)() ) {

(np->*ap)();

}

void Name::disp( void (Name::*ap)() ) {

(this->*ap)();



}





class Year : public Name

{

int age; 

public : 

Year( char * name = "no", int age = 0 );

void dispYear(); // 나이 출력

};

Year::Year( char * name , int age ) : Name( name ) {

this->age = age;

}

void Year::dispYear() {

printf("나이 : %d\n", age);

}




class Body : public Name

{

double ki; 

public : 

Body( char * name = "no", double ki = 0 );

void dispBody(); // 키 출력

};

Body::Body( char * name , double ki ) : Name( name ) {

this->ki = ki;

}

void Body::dispBody() {

printf("키 : %.2lf\n", ki);

}




// 부모가 자식을 부르는걸 해보자


void main()

{

Year kim("김유신", 30);

kim.dispName();

kim.dispYear();


Body hong("홍길동", 170.5);

hong.dispName();

hong.dispBody();


printf("\n");


void (Name::*ap)();

ap = ( void(Name::*)() ) &Year::dispYear;

kim.disp( &kim, ap );

ap = ( void(Name::*)() ) &Body::dispBody;

hong.disp( &hong, ap );


printf("\n");


hong.disp( ap );

}


*/




// 가상함수와 다형성



/*


class CellPhone

{

char model[20];

public :

CellPhone( char * model = "no" );

virtual void disp(); // 모델명 출력  // 가상함수(각각 클래스에 있는 자기꺼 찍게됨)

void show();

};

CellPhone::CellPhone( char * model) {

strcpy( this->model, model);

}

void CellPhone::disp() {

printf("모 델 명 : %s\n", model);

}

void CellPhone::show() {

disp();

}







class CaPhone : public CellPhone

{

int pixel;

public : 

CaPhone( char * model = "no", int pixel = 0 );

virtual void disp(); // 픽셀 출력

};

CaPhone::CaPhone( char * model , int pixel ) : CellPhone( model ) {

this->pixel = pixel;

}

void CaPhone::disp() {

printf("화    소 : %d\n",pixel);

}







class Mp3Phone : public CaPhone

{

int chord;

public : 

Mp3Phone( char * model = "no", int pixel = 0, int chord = 0 );

virtual void disp(); // 화음 출력

};

Mp3Phone::Mp3Phone( char * model , int pixel , int chord ) : CaPhone( model , pixel ) {

this->chord = chord;

}

void Mp3Phone::disp() {

printf("화    음 : %d\n",chord);

}






void main() {


CellPhone cp("Galaxy S3");

cp.show();


CaPhone ca("iPhone", 500);

ca.show();


Mp3Phone mp("G2", 600, 64);

mp.show();

}


*/




/* 


순수 가상함수 / 추상 클래스

순수 가상함수를 가지면 추상 클래스가 된다.

순수 가상함수는 구현하지 않는다.

객체를 생성할 수 없다.

항상 상속으로 구현된다.

상속 시 순수 가상함수는 빠짐없이 구현해야 한다.

*/


/*


class Name // 추상 클래스

{

char name[12];

public : 

Name( char * name = "no" );

void disp(); // 이름 출력


virtual void dispAll() = 0; // 순수 가상함수 / 구현하지 않는다

};

Name::Name(char * name) {

strcpy( this->name, name );

}

void Name::disp() {

printf("이름 : %s\n", name);

}






class Year : public Name

{

int age;

public : 

Year( char * name = "no" , int age = 0 );

void disp(); // 이름 출력

void dispAll();

};

Year::Year( char * name , int age ) : Name( name ) {

this->age = age;

}

void Year::disp() {

printf("나이 : %d\n", age);

}

void Year::dispAll() {}







class Body : public Year

{

double ki;

public : 

Body( char * name = "no" , int age = 0 , double ki = 0 );

void disp(); // 이름 출력

void dispAll();

};

Body::Body( char * name , int age , double ki ) : Year( name , age ) {

this->ki = ki;

}

void Body::disp() {

printf("키 : %.2lf\n", ki);

}

void Body::dispAll() {}




void main()

{

Year lee("이순신", 40 );

Body kim("김유신", 30, 170.5);

kim.Name::disp();

kim.Year::disp();

kim.disp();



}

*/







// 순수가상함수를 이용한 다형성 

class Shape

{

protected : 

int a, b; // 밑변 높이 or 반지름

double area;

public :

Shape( int a = 0 , int b = 0 , double area = 0 );

virtual void input() = 0; // 입력

virtual void calc() = 0; // 계산 

virtual void disp() = 0; // 출력

};

Shape::Shape( int a , int b , double area ) {

this->a = a;

this->b = b;

this->area = area;

}



class Rect : public Shape

{

public : 

Rect( int a = 0 , int b = 0 , double area = 0 );


void input();

void calc() ;

void disp() ;

};

Rect::Rect( int a , int b , double area ) : Shape( a , b , area ){

}

void Rect::input() {

puts("사각형의 넓이" );

printf( "밑변 : " );

scanf( "%d", &a );

printf( "높이 : " );

scanf( "%d", &b );

}

void Rect::calc()  {

area = a * b;

}

void Rect::disp() {

printf("넓이 : %.2lf\n", area );

}








class Tri : public Shape

{

public : 

Tri( int a = 0 , int b = 0 , double area = 0 );


void input();

void calc() ;

void disp() ;

};

Tri::Tri( int a , int b , double area ) : Shape( a , b , area ){

}

void Tri::input() {

puts("삼각형의 넓이" );

printf( "밑변 : " );

scanf( "%d", &a );

printf( "높이 : " );

scanf( "%d", &b );

}

void Tri::calc()  {

area = a * b / 2.;

}

void Tri::disp() {

printf("넓이 : %.2lf\n", area );

}









class Circle : public Shape

{

public : 

Circle( int a = 0 , int b = 0 , double area = 0 );


void input();

void calc() ;

void disp() ;

};

Circle::Circle( int a , int b , double area ) : Shape( a , b , area ){

}

void Circle::input() {

puts("원의 넓이" );

printf( "밑변 : " );

scanf( "%d", &a );

}

void Circle::calc()  {

area = a * a * 3.14;

}

void Circle::disp() {

printf("넓이 : %.2lf\n", area );

}





void main()

{

Shape * m[] = { new Rect, new Tri, new Circle };

int i;


for ( i=0 ; i<3 ; i++ ) {

m[i]->input();

m[i]->calc();

m[i]->disp();

}

//Rect r;

//Tri t;

//Circle c;


//r.input();

//r.calc();

//r.disp();

//t.input();

//t.calc();

//t.disp();

//c.input();

//c.calc();

//c.disp();



}





// 가상 소멸자


// Templete


// STL

저작자 표시 비영리 변경 금지
신고

'Study > C, C++' 카테고리의 다른 글

130826.15일차  (0) 2013.08.26
130823.14일차  (0) 2013.08.26
130822.13일차  (0) 2013.08.22
130821.12일차  (0) 2013.08.22
130820.11일차  (0) 2013.08.22
130819.10일차  (0) 2013.08.22
Trackback 0 And Comment 0

티스토리 툴바