지속가능티끌/C . C++2015. 12. 28. 21:19

 

 

개요.

 

C++ 에서 상속관계에 있는 "베이스 클래스 - 파생클래스" 에서 파생클래스 측에서의 생성자 처리법 정리.

 

요구사항.

1. 베이스 클래스에 인자있는 생성자만 정의해뒀다.

2. 파생클래스에도 인자있는 생성자가 정의되어있다.

2. 파생클래스 개체 생성시 상기1의 베이스클래스의 인자있는 생성자 호출되게 하고 싶다.

 

 

2가지 방법 가능.


방법1. 파생클래스에 인자있는 생성자의 선언 및 정의시 베이스클래스의 생성자 명시적 실행되도록 한다.

방법2. 파생클래스에는 별도의 생성자 만들지 않고 베이스클래스의 생성자를 상속받아서 사용한다.

방법2가 더 간단함.

 

 

 

 

 

 

방법1.

 

 

// 베이스 클래스에 인자있는 생성자를 정의하였다.

class CBase

{

public:

   CBase(int a); // 베이스 클래스의 인자 있는 생성자.

 

};

 

// 파생클래임.

class  CDerived :: CBase

{

   CDerived(int a); // 파생클래스의 인자 있는 생성자.

};

 

아래처럼 파생클래스 생성자 함수명 뒤에 연결하여 : CBase(..)  처럼 베이스클래스 생성자를 명시하면, 파생클래스 개체 생성시 베이스클래스의 인자있는 생성자가 호출되면서 정상적으로 파생클래스 개체 생성된다. 


// CDerived 생성자 정의.

CDerived::CDerived(int a) : CBase(a)  // 베이스 클래스 생성자에 인자 a 전달되면서 CBase 생성자 실행되게 됨.

{

}


만일 CDerived 생성자 정의를 아래 처럼 구현하면 컴파일 에러 발생하게 된다. 

사유 :  파생클래스 개체 생성시, 베이스클래스 인자 없는 생성자를 먼저 호출하려고 하게되는데 본 예의 베이스 클래스에는 무 인자 생성자 정의 없이 유 인자 생성자만 만들었기 때문임.


CDerived::CDerived(int a)

{


}

 

 

 

 

 

 

방법2. 상속생성자.

 


class CBase

{

   CBase(int a); // 베이스 클래스의 인자 있는 생성자. 

};

 

class  CDerived :: CBase

{

   using CBase :: CBase; // <- 베이스 클래스의 생성자를 그대로 파생클래스에서도 사용할 수 있게 해준다.

};

CDerived 에 별도의 생성자 정의하지 않고 베이스 클래스의 생성자를 상속받은 것. 즉, 파생클래스에서 별도 생성자에서 처리가 필요치 않고 베이스 클래스의 생성자 에서의 초기화 만으로 충분한 경우 적합한 방식.

 

파생 클래스 개체 생성예.  베이스클래스 생성자 초기화 수행되면서 파생클래스 개체 정상적으로 생성됨.

CDerived* p_object = new CDerived(1);  

 

 

 

 

 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 

///527.

Posted by 리치굿맨

댓글을 달아 주세요

  1. 않이

    뭘 검색해도 이분 블로그가 나오네요. 진심 무섭습니다..

    2021.02.23 21:51 [ ADDR : EDIT/ DEL : REPLY ]