본문 바로가기

공부/c++

virtual 키워드 사용법

반응형

1.동적바인딩
기반클래스에 상속클래스를 대입했을때
기반클래스의 기반클래스의 함수가 아니라
기반클래스에서 상속클래스의 함수를 호출하도록 설정
 
2.순수가상함수
virtual int print() = 0;
기반클래스는 이 함수를 정의하지 않고
상속클래스에서 함수를 정의하도록 함
기반클래스는 이 함수땜에 생성을 할 수 없다

3.  가상(virtual) 기본 클래스가 필요한 이유는?

(이것도 마찬가지로 복사)

다중 상속의 경우 한 클래스를 두 번 상속받을 경우 멤버가 중복되어 메모리가 낭비되며 멤버의 모호함이 발생한다.
이 문제를 해결하려면 클래스를 두 번 상속받아도 한번만 상속하도록 하면 되는데 이것을 가능하게 해주는 클래스를 가상 기반 클래스라고 한다.
가상 기반 클래스로 지정된 클래스는 간접적으로 두 번 상속되더라도 결과 클래스에는 자신의 멤버를 한 번만 상속시킨다.

class B : virtual public A

virtual 키워드와 액세스속성의 순서는 상관없으나 보통 virtual을 먼저 사용한다.
virtual 키워드는 A 클래스가 두 번 이상 상속될 경우에만 효과가 있으며, 이때 상속받은 클래스는 실제로 A의 멤버를 상속받지 않고 최종적으로 다중 상속되는 클래스에 상속될 수 있도록 중간 중계역할을 한다.

class B : virtual public A
class C : virtual public A
class D : public B, public C

위와 같이 D가 다중 상속되어있을 경우 D의 생성자를 통해 B, C의 생성자를 호출했을 때 B, C의 생성자는 A의 생성자를 호출하지 않는다. 왜냐하면 가상 클래스인 A를 상속받은 B와 C는 가상 클래스인 A의 멤버를 직접적으로 소유하지 않으며 최종 클래스인 D에서 이 멤버를 어떤 용도로 사용하는지 알 수 없기 때문이다.
이 경우 중간 클래스인 B 와 C의 생성자가 A의 생성자를 호출할 경우 값을 어떻게 초기화해야할지 애매해지기 때문에 최종 클래스인 D에서 생성자를 호출하여 초기화하도록 해야 한다.
반응형