####

자식 클래스의 객체에 부모 클래스의 포인터를 사용한다면?


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