갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • C++
  • 모바일 게임 순위
  • C++ 상속
  • c# Thread
  • C++ 소멸자
  • 강남 방탈출
  • 게임 디자인 패턴
  • pc게임 순위
  • 전세계게임매출순위
  • c# 코루틴
  • 2020년 게임 매출
  • 글로벌게임매출
  • 알고리즘
  • c# coroutine
  • pc 게임 순위
  • c# delegate
  • C# boxing
  • 게임 매출 순위
  • C# 예외 처리
  • C++ virtual
  • Unity Graph
  • 유니티 그래프
  • c# collection
  • 전세계 게임 매출
  • 자바
  • 유니티 골드그래프
  • 롤 골드그래프
  • 게임매출순위
  • 유니티 그래프 그리기
  • c# unboxing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] 다중 상속 (multiple inheritance)
프로그래밍/C++

[C++] 다중 상속 (multiple inheritance)

2019. 12. 3. 00:36
728x90
반응형

1. 핵심 정리

class InputFile {
public:
    void read() {}
    void open() {}
};

class OutputFile {
public:
    void write() {}
    void open() {}
};

class IOFile : public InputFile, public OutputFile {
};

int main() {
    IOFile file;
    
    file.open();            // error
    file.InputFile::open(); // ok
}

  ① 다중 상속 이란? (multiple inheritance)

    => 클래스가 2개 이상의 기반 클래스로부터 상속 되는 것

    => C++, Lisp, Curl 등은 다중상속을 지원하지만 Java, C#등은 다중 상속을 지원하지 않는다.

 

  ② 다중 상속의 문제점

    => 서로 다른 기반 클래스에 동일 이름의 멤버가 있을 때 이름 충돌

    => Diamond 형태의 상속

 


2. 문제점 및 해결

#include <iostream>
#include <string>

class File {
public:
    std::string filename;
    void open() {}
};

class InputFile : public File {
public:
    void read() {}
};

class OutputFile : public File {
public:
    void write() {}
};

class IOFile : public InputFile, public OutputFile {
};

int main() {
    IOFile file;
}

 

1번 코드에서 문제가 되었던 open() 멤버 함수가 겹치는 문제를 피하기 위해
File이라는 기반 클래스를 만들고 공통의 멤버 데이터와 함수를 만들었다.
이제 문제가 되는건 없어 보인다만... 일단 이 구조를 그림으로 보자.

  ① Diamond 상속이란?

무엇이 문제일까?

  ② IOFile 객체를 생성하면?

위와 같이 메모리에 놓이게 되고, 위의 형태는 1번 코드와 같이
open()함수의 이름이 겹치게 되는 문제가 있다.

  ③ virtual 상속을 사용하면 File의 인스턴스가 메모리에 한번만 생성되게 된다.

class File {
public:
    std::string filename;
    void open() {}
};

class InputFile : virtual public File {
public:
    void read() {}
};

class OutputFile : virtual public File {
public:
    void write() {}
};

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] 연산자 재정의 주의 사항  (0) 2019.12.14
[C++] 연산자 재정의 (operator overloading)  (0) 2019.12.14
[C++] RTTI (Run Time Type Information)  (0) 2019.12.02
[C++] 인터페이스 (interface)  (0) 2019.12.01
[C++] 추상 클래스 (abstract class)  (0) 2019.11.30
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] 연산자 재정의 주의 사항
    • [C++] 연산자 재정의 (operator overloading)
    • [C++] RTTI (Run Time Type Information)
    • [C++] 인터페이스 (interface)
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바