C & C++/C++

[C++] multiple inheritance(다중 상속), virtual inheritance(가상 상속), virtual function(가상함수)

  • -
728x90

multiple inheritance

class 파생클래스이름 : 접근제어지시자 기초클래스이름, 접근제어지시자 기초클래스이름[, 접근제어지시자 기초클래스이름, ...]
{
    // 파생 클래스 멤버 리스트
}

 

다중 상속의 문제점

"다중 상속은 득보다 실이 많은 문법이다."

  • 상속받은 여러 기초 클래스에 같은 이름의 멤버가 존재할 가능성이 있다.
  • 하나의 클래스를 간접적으로 두 번 이상 상속받을 가능성이 있다.
  • 가상 클래스가 아닌 기초 클래스를 다중 상속하면, 기초 클래스 타입의 포인터로 파생 클래스를 가리킬 수 있다.

virtual inheritance

이와 같은 상속의 구조에서는 Derived class3이 Base class를 간접적으로 두 번 상속한다는 점이다. 따라서 같은 이름의 멤버 함수를 호출하려면 어느 클래스를 통해서 간접 상속한  Base class의 멤버함수를 호출할 것인지 명시해야한다.

 

이러한 문제를 해결하기 위한 문법이 가상 상속이다. 파생 클래스에 기초 클래스를 가상 상속 선언을 하면 기초 클래스의 생성자는 한 번 호출될 것이고, 그렇지 않으면 두 번 호출될 것이다.

virtual function

파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미한다.

 

기초 클래스에서 virtual 키워드를 사용해 가상 함수를 선언하면, 파생클래스에서 재정의된 멤버 함수도 자동으로 가상함수가 되지만, 파생 클래스에서도 virtual을 사용하여 가상 함수임을 명시하는 것이 좋다.

 

dynamic binding(동적 바인딩)

C++ 컴파일러는 함수를 호출할 때, 어느 블록에 있는 함수를 호출해야 하고, 해당 함수가 저장된 정확한 메모리 위치까지도 알아야 한다.

함수를 호출하는 코드에서 어느 블록에 있는 함수를 실행하라는 의미로 해석하는 것을 바인딩이라고 하는데, C++에서는 함수가 오버로딩 될 수 있어 작업이 복잡해진다.

 

대부분 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환한다. 이것을 정적 바인딩(static binding)이라고 한다.

C++에서는 가상 함수가 아닌 멤버 함수는 모두 정적 바인딩을 하게 된다.

 

가상 함수는 프로그램이 실행될 때 객체를 결정하므로 컴파일 타임에 해당 객체를 특정할 수 없기 때문에, 가상 함수의 호출은 컴파일러가 어떤 함수를 호출해야 하는지 미리 알 수 없다.

따라서 가상 함수의 경우에는 올바른 함수가 실행될 수 있도록 해야 한다.

 

 

virtual destructor(가상 소멸자)

C++에서 기초 클래스의 소멸자는 반드시 가상으로 선언해야한다.

 

 

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.