프로그래밍/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
반응형