다형성의 기본개념
자식클래스의 객체에 부모 클래스의 포인터를 사용한다면?
부모클래스 *포인터 = 자식클래스;
위처럼 하면 부모클래스의 메소드가 실행된다.
하지만 virtual을 메소드에 붙여주면 자식 메소드가 실행되게 된다.
virtual void speak() const
{
cout << m_name << " ??? " << endl;
}
자식클래스에 메소드가 없으면 부모클래스가 실행된다.
이걸 다형성이라고 부른다.
#include <iostream>
#include <string>
using namespace std;
class Animal
{
protected:
string m_name;
public:
Animal(string name)
: m_name(name) {
}
string getName() { return m_name; }
virtual 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 << " Woof " << endl;
}
};
int main() {
Animal a("Animal");
Dog d("Dog");
Cat c("Cat");
//자식클래스를 부모클래스의 포인터로 캐스팅해서 사용하면
//자신이 부모클래스인줄 알고 작동한다.
a.speak();
d.speak();
c.speak();
Animal *a1 = &d;
Animal *a2 = &c;
//활용하는 경우
Cat cats[] = { Cat("cat1"),Cat("cat2"), Cat("cat3"), Cat("cat4"), Cat("cat5") };
Dog dogs[] = { Dog("dog1"), Dog("dog2") };
//위에껄 다 확인해볼려면 for문을 사용해야한다.
Animal *my_animals[] = { &cats[0],&cats[1], &cats[2], &cats[3], &cats[4], &dogs[0], &dogs[1] };
//부모클래스의 메소드가 실행된다.
//virtual 을 붙이면 자식클래스인것처럼 실행한다.
//이런 성질을 다형성이라고 한다.
for (int i = 0; i < 7; i++)
my_animals[i]->speak();
return 0;
}
'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글
c++ override,final,공변 반환값 (0) | 2019.09.23 |
---|---|
c++ 가상함수와 다형성 (0) | 2019.09.23 |
c++ 상속받은 함수를 오버라이딩하기 (0) | 2019.08.30 |
c++ 상속과 접근지정자 (0) | 2019.08.30 |
c++ 상속 유도된 클래스들의 생성과 초기화 (0) | 2019.08.30 |