티스토리 뷰

언어/C++

12.2 가상 함수와 다향성

js0331 2020. 5. 5. 09:42
int main()
{
	A a;
	B b;
	C c;
	D d;
	
	A &ref = b;
	ref.print();

	
	return 0;
}

// A

 

저번 포스팅의 포인터와 같이 똑같이 작동한다.

 

BUT, A 클래스 안의 print() 함수에다가 virtual을 붙힐시 자식들은 오버라이딩된 함수가 있을시 그 함수를 사용한다.

 

class A
{
	public:
	virtual void print() { cout << "A" << endl;}
};

 

int main()
{
	A a;
	B b;
	C c;
	D d;
	
	B &ref = c;
	ref.print();

	
	return 0;
}

 

이렇게 하면 어떻게 될까?

 

B는 virtual이 없다. C는 B를 상속받는다.  B는 A를 상속받는다.

 

A의 경우 virtual이 존재한다. 상속의 계층적 구조에서 가장 상위 클래스가 virtual이 되있다면 하위클래스는 virtual 처럼 행동하게 된다.

 

위 main()의 결과는 "C"이다.

 

 

만약 virtual과 오버라이딩된 함수가 리턴값이 다르면 어떻게 될까?

 

class D : public C
{
	public:
	int print() { cout << "D" << endl; return 0;} // error!
};

 

답은 error가 난다. 이 부분을 특히 조심해야 한다.

 

 

virtual function은 효율을 증시하는 프로그램에서는 사용을 자제해야한다.

 

왜냐하면 계층적인 구조로써 부모 클래스를 올라가야하기 때문에 이러한 반복이 계속 일어나게 될 경우 효율이 떨어지게 된다.

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함