개요. | |
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(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.
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
C++ std::thread 클래스 이용한 스레드. 클래스멤버함수를 스레드로 실행시키는 방법. (0) | 2016.01.16 |
---|---|
C++. 함수 인자로 포인터 전달하고 함수내에서 동적 메모리 할당 받기 2가지 방식. ** *& (1) | 2016.01.04 |
C++. 클래스 생성자 관련 기초 지식. - 디폴트 생성자/복사생성자/디폴트복사생성자/Shallow Copy/Deep Copy 등. (0) | 2015.12.28 |
2차원 이상 배열의 메모리 배치순서. (0) | 2015.01.17 |
STL std::function 기반 콜백함수 구현. (0) | 2015.01.11 |
댓글