반응형

간단한 출력하는 멤버함수들을 갖는 클래스로 예제

#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) 이렇게 해야된다.

기본클래스의 생성자를 이용해야 한다는 점!

반응형
Posted by Rainfly
l