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;
}