그럴듯한 개발 블로그
article thumbnail
반응형

상속

class 자식클래스 : 접근제한자(public, protected, private) 부모클래스
{
    추가 멤버 선언
};
  • 틀을 가져다 그대로 복사하고 추가하는 느낌으로 이해했다.
  • 자식 클래스에선 부모의 private는 접근할 수 없다.
  • private는 해당 클래스 내에서만 접근이 가능하고, protected는 해당 클래스와 하위 클래스에서 접근이 가능하다.
  • 접근 제한자를 설정하면 그 접근 제한자보다 높은 권한? 은 같은 권한으로 바꾼다.
    • ex) private로 상속하면, 상속받은 부모의 public멤버도 다 private처리됨
    • private < protected < public
    • public으로 상속하면 그냥 권한 그대로 쓴다는 뜻.
  • virtual ?
    • 자식 클래스에서 함수를 재정의(override)할 때 부모 클래스의 함수와 헷갈리지 않게 해 주는 키워드이다.
    • 부모 클래스의 소멸자를 virtual로 선언하지 않으면 자식 클래스의 소멸자가 작동하지 않는다. 그 이유는 가상함수로 정의되지 않은 자식 클래스의 오버라이딩된 함수를 선언하면 부모 클래스의 멤버 함수가 호출되기 때문이다. 이와 같은 이유로 자식 클래스의 메모리 해제가 필요하다면 반드시 부모 클래스에 소멸자를 작성해야 한다.
    • == 같은 이름의 자식의 재정의 된 함수가 있으면 부모 함수가 먼저 실행돼서 생기는 일
  • 메모리에 저장되는 방식
    • 구조체처럼 size를 할당해서 멤버변수, 멤버 함수의 함수포인터 순으로 저장된다. 상속 시 추가된 멤버가 있으면 늘어난 사이즈만큼의 부분에 같은 순서대로 할당된다.
    • ex) ppppppp cccc
  • 가상함수 테이블
    • c++에서는 가상함수를 그 함수포인터들을 모아놓은 가상 함수 테이블이란 걸 생성해서 관리한다.
    • 가상함수를 추가하면 객체의 멤버 변수로 가상함수 테이블을 가리키는 포인터를 추가한다.
    • 바이트 패딩 - https://younggwan.tistory.com/41
class Parent {
  public:
	virtual void func1();
	virtual void func2();
};
class Child : public Parent {
  public:
	virtual void func1();
	void func3();
};

https://koreanfoodie.me/835

 

#include <iostream>
using namespace std;

class Parent {
public:
    virtual void func1() {
        cout << "P1" << endl;
    }
    void func2() {
        cout << "P2" << endl;
    }
    virtual void func3() {
        cout << "P3" << endl;
    }
};

class Child : public Parent {
public:
    virtual void func1() {
        cout << "C1" << endl;
    }
    virtual void func2() {
        cout << "C2" << endl;
    }
};

int  main() {
    Parent *c = new Child();

    c->func1(); // Child의  가상함수테이블  참조
    c->func2(); // Child의  가상함수테이블 참조 + 자식에도 virtual붙혀서 가독성++
    c->func3();
}
// 메모리 구조
// pppppppppppccccc

 

위와 같이 parent포인터지만 child를 가리키게 하는 업캐스팅 상황엔 c가 parent size만큼만 접근 가능하다.

즉 상속받으면서 추가된 child의 함수에 접근 불가능하다. 하지만 가상함수가 한 개라도 있으면 class 메모리의 첫 번째에 가상함수 테이블을 가리키는 포인터가 추가되는데 이를 통해 현재 객체에 맞는 가상함수를 찾아갈 수 있다.

순수 가상함수

말 그대로 진짜 가상 함수다. 아무것도 구현 안되어있는.

func()=0 이렇게 선언하고 반드시 오버라이딩해줘야 하는 함수이다.

이게 하나라도 있으면 인스턴스화할 수 없는 추상클래스가 된다

추상클래스

추상 클래스는 개념적으로 인스턴스화 할 수 없는 클래스. 즉, 인스턴스를 생성할 수 없는 클래스로, 일반적으로 하나 이상의 순수 가상 함수가 있는 클래스로 구현된다.

인터페이스

인터페이스는 구현이 없다.
즉, 인터페이스 클래스에는 가상 소멸자와 순수 가상함수만 포함된다.
인터페이스 클래스는 다형성 인터페이스, 즉 순수 가상 함수 선언을 기본 클래스로 지정하는 클래스이다.

반응형

'<language> > c++' 카테고리의 다른 글

간단 echo server 구현 (C++)  (2) 2023.10.16
c++ 레퍼런스(참조자)  (8) 2023.07.06
c++ 동적할당  (0) 2023.07.06
cpp 파일 컨트롤(ifstream ofstream)  (0) 2023.07.05
cpp split  (0) 2023.05.29
profile

그럴듯한 개발 블로그

@donghyk2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!