티스토리 뷰

언어/C++

12.1 다형성의 기본 개념

js0331 2020. 5. 4. 21:54
#include<iostream>
#include<string>

using namespace std;

class Animal
{
	protected:
	string m_name;
	
	public:
	Animal(std::string name_in)
		: m_name(name_in)
	{}
	
	void speak() const
	{
		cout << m_name << " ???" << endl;
	}
};

class Cat : public Animal
{
	public:
	Cat(string name)
		: Animal(name)
	{}
	
	void speak() const
	{
		cout << m_name << " Meow" << endl;
	}
};

class Dog : public Animal
{
	public:
	Dog(string name)
		: Animal(name)
	{}
	
	void speak() const
	{
		cout << m_name << " Wal" << endl;
	}
};

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();
	ptr_animal2->speak();
}

// My animal ???
// my cat Meow
// my dog Wal
// my cat ???
// my dog ???

 

자식 클래스를 부모 클래스의 포인터를 시켜놓고 캐스팅을 시켜놓으면 자기가 부모 클래스 인줄 알고 작동한다.

 

	virtual void speak() const
	{
		cout << m_name << " ???" << endl;
	}

 

virtual을 쓸 시 부모 클래스의 포인터를 캐스팅해도 ???가 뜨지 않고 자식 클래스가 하나하나 자기 역할을 하게 된다.

 

int main()
{
	Cat cats[] = {Cat("cat1"), Cat("cat2"), Cat("cat3"), Cat("cat4"), Cat("cat5")};
	Dog dogs[] = {Dog("dog1"), Dog("dog2")};
	
	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();
	
	return 0;
}

// cat1 Meow
// cat2 Meow
// cat3 Meow
// cat4 Meow
// cat5 Meow
// dog1 Wal
// dog2 Wal
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함