'동적바인딩'에 해당되는 글 1건

  1. 2008.09.01 c++ . object pointer, dynamic binding, virtural
2008. 9. 1. 16:00

c++ . object pointer, dynamic binding, virtural

#include<iostream>

using std::cout;
using std::cin;
using std::endl;
//////////////////////////////////////// class 선언부

//추상 클래스 - 순수 가상 함수를 한개 이상 포함한 클래스
//절대로 객체 생성이 불가능 - 자식을 위해 틀을 만드는 클래스

class Animal
{
public:
 Animal()
 {

 }
 //순수 가상함수 - 반드시 오버라이딩해서 써야하는 함수
 //선언부만 있고 정의부는 없는 함수
 virtual void Speak()=0;
 virtual void Walk();
 //부모 클래스에 가상 함수가 포함되었다면 반드시 소멸자를 가상으로 추가해야한다.
 virtual ~Animal()
 {
  cout<<"~Animal소멸자"<<endl;
 }
};

class Dog : public Animal
{
public:
 virtual void Speak();
 ~Dog()
 {
  cout<<"~Dog 소멸자"<<endl;
 }
};

class Cat : public Animal
{
public:
 virtual void Speak();
 ~Cat()
 {
  cout<<"~Cat 소멸자"<<endl;
 }
};
class Pig: public Animal
{
public:
 virtual void Speak();
 ~Pig()
 {
  cout<<"~Pig 소멸자"<<endl;
 }
};
class Duck: public Animal
{
public:
 virtual void Speak();
 virtual void Walk();
 ~Duck()
 {
  cout<<"~Duck 소멸자"<<endl;
 }
};
//////////////////////////////////////////// 정의부
//void Animal::Speak(){ cout<<"기본 울음 소리";}
void Animal::Walk(){ cout<<"네발로 걷는다"<<endl;}
////////////////////
void Dog::Speak(){ cout<<"왈 왈 "<<endl;}
///////////////////
void Cat::Speak(){ cout<<"야옹"<<endl;}
//////////////////
void Pig::Speak(){ cout<<"꿀꿀"<<endl;}
//////////////////
void Duck::Speak(){ cout<<"꽥꽥"<<endl;}
void Duck::Walk(){ cout<<"두발로 걷는다"<<endl;}

int main()
{
 Animal *ptr; // 객체 포인터
 //ptr=new Animal;
 
 int n;

 while(1)
 {
  cout<<"\n1. dog  2.cat 3.pig 4.duck 5.exit\n";
  cout<<"choice :";
  cin>>n;
  switch(n)
  {
  case 1:
   ptr= new Dog;
   break;
  case 2:
   ptr= new Cat;
   break;
  case 3:
   ptr= new Pig;
   break;
  case 4:
   ptr= new Duck;
   break;
  default:
   exit(0);
 
  }
  ptr-> Speak();
  ptr->Walk();
  delete ptr;  //동적 객체 해제 => 소멸자 호출
 }
 return 0;
}