본문 바로가기

Study/C C++

[두들낙서] 상속

상속

 - 상위 클래스의 멤버 변수와 메소드를 하위 클래스에서 사용할 수 있도록 한다

 주의 상위 클래스에서 하위 클래스의 멤버 변수와 메소드 사용이 불가능하다

 ex) class Base {

      public:

           void bFunc() { }

           int bNum;

      };

      class Derived : public Base {

      public:

           void dFunc() { }

           int dNum;

      };

 

부모 클래스

 - 자식 클래스로 상속을 해준 상위 클래스

 

자식 클래스

 - 부모 클래스로 부터 멤버 변수와 메소드를 상속받은 하위 클래스

 - 부모 클래스의 멤버 변수와 메소드에 추가 변수와 메소드를 더한다

 주의 자식클래스가 부모클래스에 속해있다  부모클래스가 더 큰 범위의 클래스다

 

접근 제어

 - 외부접근은 제한되지만 자식 클래스에서 접근은 가능하다

 ex) class Base {

      public:

           int bPulbic;  외부 접근 o, 자식 클래스 접근 o

      protected:

           int bProtected;  외부 접근 x, 자식 클래스 접근 o

      private:

           int bPrivate;  외부 접근 x, 자식 클래스 접근 x

      };

      class Derived1 : public Base { /* 중략 */ };

      class Derived2 : protected Base { /* 중략 */ };  Base 클래스의 public을 protected 수준으로 내린다

      class Derived3 : private Base { /* 중략 */ };  Base 클래스의 public과 protected를 private 수준으로 내린다

 

클래스 오버라이딩

 - 부모 클래스의 멤버 변수와 메소드를 오버라이딩 가능하다  부모클래스의 값이 바뀐것이 아닌 자식클래스가 우선이다

 - override : 우선하다  함수의 overloading(이름이 같은 함수를 여러개 생성)과 overwriting(덮어쓰기)와 다르다

 ex) class Base {

      public:

           int a = 10;

      };

      class Derived : public Base {

      public:

           int a = 20;

      };

      Base b;

      Derived d;

      cout << b.a << endl;  10

      cout << d.a << endl;  20

      cout << d.Base::a << endl;  10

      cout << d.Drived::a << endl;  20

 

정적 바인딩

 - 모호한 포인터가 어떤 타입을 가리키는지 결정하는 것을 바인딩이라고 한다

 - 정적 바인딩은 포인터가 포인터의 타입을 가리키게 하는 바인딩이다

 - C++의 기본은 정적 바인딩이다

 ex) class Base {

      public:

           void print() { };

      };

      class Derived : public Base {

      public:

           void print() { };

      };

      Base *b = new Derived();  부모 클래스의 포인터가 자식 클래스를 가리킬 수 있다

      b->Print();  부모 클래스의 메소드를 출력한다

      delete b;

 

동적 바인딩

 - 포인터가 자식 클래스의 타입을 가리키게 하는 바인딩이다

 - 부모클래스에서 메소드에 virtual을 붙여준다

 ex) class Base {

      public:

           virtual void print() { /* 중략 */ };  가상 함수: 프로그램을 만들때는 알 수 없으니 실행될 때 결정되게끔 한다

      };

      class Derived : public Base {

      public:

           void print() { /* 중략 */ };

      };

      Base *b = new Derived();

      b->Print();  자식 클래스의 메소드를 출력한다

      delete b;

 

추상 클래스

 - 순수 가상 함수를 가지고 있는 클래스다

 - 순수 가상 함수는 가상함수가 '= 0' 이나 'NULL'로 개체가 없는 함수다

 - 클래스들을 하나로 묶어줄 때 유용하다

 ex) class Shape {

      public:

           virtual double GetAre() = 0;  순수 가상 함수

           virtual void Resize(double f) = 0;

      };

 

생성자와 소멸자

 - 생성자가 실행되는 순서는 부모클래스의 멤버 변수 -> 메소드 -> 자식 클래스의 멤버변수 -> 메소드이다

 - 소멸자가 실행되는 순서는 생성자 실행 순서의 반대다

 

가상 소멸자

 - 소멸자를 동적 바인딩 시켜주기 위해 사용한다

 - 소멸자 앞에 virtual을 붙여준다

'Study > C C++' 카테고리의 다른 글

[두들낙서] 상속에서의 형변환  (0) 2021.03.06
[두들낙서] 묵시적 형변환  (0) 2021.03.04
[두들낙서] 객체 복사  (0) 2021.03.04
[두들낙서] 동적 할당  (0) 2021.03.04
[두들낙서] 클래스와 객체  (0) 2021.03.04