12.1 다형성의 기본 개념
####
자식 클래스의 객체에 부모 클래스의 포인터를 사용한다면?
#include <iostream>
#include <string>
using namespace std;
class Animal
{
protected:
string m_name;
public:
Animal(std::string name)
: m_name(name)
{}
public:
string getName() { return m_name; }
virtual void speak() const
{
cout << m_name << " ??? " << "\n";
}
};
class Cat : public Animal
{
public:
Cat(string name)
: Animal(name)
{}
void speak() const
{
cout << m_name << " Meow " << "\n";
}
};
class Dog : public Animal
{
public:
Dog(string name)
: Animal(name)
{}
void speak() const
{
cout << m_name << " Woof " << "\n";
}
};
int main()
{
Animal animal("my animal");
Cat cat("my cat");
Dog dog("my dog");
animal.speak();
cat.speak();
dog.speak();
Animal *ptr_animal1 = &cat;
Animal *ptr_animal2 = &dog;
ptr_animal1->speak(); // my cat ???
ptr_animal2->speak(); // my dog ??? // 자기가 부모클래스인줄 알고 작동한다.
//
Cat cats[] = {Cat("cat1"), Cat("cat2"), Cat("cat3"), Cat("cat4"), Cat("cat5")};
Dog dogs[] = { Dog("dog1"), Dog("dog2")};
for (int i=0; i<5; ++i)
cats[i].speak();
// 이런식으로 for문을 돌려서 하기 보다는
Animal *my_animals[] = {&cats[0], &cats[1], &cats[2], &cats[3], &cats[4],
&dogs[0], &dogs[1]};
for (int i=0;i<7;++i)
my_animals[i]->speak(); // 이렇게 하면 cat1 ??? 이런식으로 나온다. 하지만 virtual을 붙인다면 자식클래스인것처럼 나온다.
return 0;
}