12.2 가상 함수와 다형성

보물창고·2021년 8월 12일
0

가상함수란?

: virtual 키워드를 붙임으로써 파생클래스에서 부모의 멤버함수를 재정의해
사용을 가능게 하는 함수.

가상 클래스란?

: 가상함수가 하나라도 있는 클래스를 말하고, 이때 v-table 포인터가 만들어진다.

예제


: 이거는 확실히 인지하고 있따.

  • 하지만 이렇게 하면 어떻게 될까?

    : virtual 키워드는 A클래스에다가만 해주엇는데, C클래스의 hello 함수에 먹혔다.
    vitrual 키워드는 모든 자손에 다 적용된다는 것이다.

    부모클래스인 A에서 가상함수 포인터라는 놈이 만들어지고 그친구가
    B -> C 의 hello 함수를 거쳐오면서 C의 hello를 호출하게 된다.

가상함수는 꼭 필요한 곳에서만.

  • 오버라이딩 할때 리턴 타입은 무조건 같아야 한다.
  • virtual 함수를 클래스 3,4단계까지 상속받아서 사용하면
    효율이 좋지 않다.
  • virtual table을 통해 상속받은 클래스로 찾아가는 과정을 거치므로 좋지 않다.

    부모 클래스 -> 파생클래스 / 이런식으로 진행된다.

최종 소스코드


#include <iostream>
#include <string>
#include <vector>

class A {
public : 
	A()
	{
		std::cout << "생성자 A" << std::endl;
	}
	virtual void hello()
	{
		std::cout << "A" << std::endl;
	}
};
class B : public A
{
public:
	B()
	{
		std::cout << "생성자 B" << std::endl;
	}
	void hello()
	{
		std::cout << "B" << std::endl;
	}
};
class C : public B
{
public:
	C()
	{
		std::cout << "생성자 C" << std::endl;
	}
	void hello()
	{
		std::cout << "C" << std::endl;
	}
};

int main()
{
	B *object = new C;
	object->hello();
	return 0;
}
profile
🔥🔥🔥

0개의 댓글