• 티스토리 홈
  • 프로필사진
    donghyk2
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
donghyk2
  • 프로필사진
    donghyk2
    • 분류 전체보기 (39)
      • <고민했던거> (2)
      • <42seoul> (4)
        • minishell (4)
      • <cs> (1)
      • <frontend> (18)
        • next.js (8)
        • vanilla-js-SPA-starter-kit (4)
        • mobx (1)
      • <language> (11)
        • c++ (6)
        • javascript (5)
      • <game server> (1)
      • <algorithm> (0)
      • <memo> (2)
      • <infra> (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • c++ class 상속, 가상함수 테이블, 추상클래스
        2023년 08월 07일
        • donghyk2
        • 작성자
        • 2023.08.07.:12

        상속

        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
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바