간단한 출력하는 멤버함수들을 갖는 클래스로 예제
#include <iostream>
using namespace std;
// 'B' is a 'A' : B는 A의 일종이다.
//기본 클래스
class A{
public :
int m_a;
void f1() { cout << "A::f1 호출\n";}
void f2() { cout << "A::f2 호출\n";}
void f3() { cout << "A::f3 호출\n";}
};
//파생 클래스
class B : public A{
public:
int m_b;
void f4() {cout << "B::f4 호출\n";}
void f5() {cout << "B::f5 호출\n";}
//재정의(원형이 동일해야 됨)
void f3()
{
cout << "B::f3 ->";
A::f3(); //재정의 하면서 상속받은 함수를 이용해서 구현할 수 도 있다.
}
};
int main()
{
B obj;
//A를 상속받은 B는 상속받은 멤버와 새로 추가된 멤버, 재정의된 멤버함수(Overriding)사용가능하다
obj.f1(); //상속 멤버
obj.f2(); //상속 멤버
obj.f3(); //상속 멤버 -> 재정의
obj.A::f3();//상속 멤버 ->재정의 , But A꺼루....
obj.f4(); //추가 멤버
obj.f5(); //추가 멤버
return 0;
}
결과는...
B객체를 만들 때, A의 생성자가 먼저 호출 된 뒤에, B의 생성자가 호출된다. (소멸자 호출 순서는 반대로)
또한, A의 생성자와 B의 생성자를 다음과 같이 만들면
A(int a=10) : m_a(a) {
cout << "A::A()\n";
}
B(int a=20, int b=20) :A(a), m_b(b){
cout << "B::B()\n";
}
초기화 리스트를 이용하여 위처럼 생성자를 만들 수 있지만,
B의 생성자에서 A의 변수를 바로 초기화리스트로 사용할 수는 없다.
즉, B(int a=20, int b=20) :m_a(a), m_b(b) 는 에러이고,
B(int a=20, int b=20) :A(a), m_b(b) 이렇게 해야된다.
기본클래스의 생성자를 이용해야 한다는 점!
'I.T > Programming' 카테고리의 다른 글
WPF 개발자가 MVVM을 선호하는 이유 (3) | 2013.02.20 |
---|---|
[C#]Visual Studio .Net 에서 MDA 오류로 디버깅 못할 때 (0) | 2013.02.07 |
[C/C++]초기화 리스트의 성능차이 (0) | 2013.01.10 |
[C/C++]알 수 없는 크기의 객체 다수 생성시 - 객체 배열, 포인터 배열 (0) | 2013.01.10 |
[Java]byte[] OutParameter, 리턴 값 다수(Return Data) 등의 방법 모색(Final) (0) | 2011.11.21 |