프로그래밍 언어/C++

[C++] 다이아몬드 다중상속

까망 하르방 2025. 3. 10. 00:32
반응형

[예시] 다이아몬드 다중 상속

#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
{
public:
};

int main()
{
    IOFile file;

    file.open(); // error
}

 


상속 형태
[IOFile] → [InputFile], [OutputFile] → [File]

 

만약에 IOFile file 에서는 File 객체가 
[InputFile], [OutputFile] 각각 만들어져 있다.
이는 file.open() 에서 어떤 객체의 open() 을 수행할지 알 수 없다.

 

즉, 개발자는 File 클래스에서 open() 함수를 두었지만
다중 상속하면서 file 인스턴스가 2번 메모리에 놓이면서
open() 함수가 어느 클래스인지 알 수 없는 상황


virtual 상속

File의 인스턴스가 메모리에 한번만 생성되게 한다.

[예제]

#include <iostream>
#include <string>

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

class InputFile : virtual public File // virtual 상속
{
public:
    void read() {}
};
class OutputFile : virtual public File // virtual 상속
{
public:
    void write() {}
};
class IOFile : public InputFile, public OutputFile
{
public:
};

int main()
{
    IOFile file;

    file.open(); // ok
}

 

 

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

 

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

다중 상속 (multiple inheritance)• 클래스 2개 이상의 기반 클래스 상속 하는 것• Java, C# 에서는 지원하지 않지만 C++에서는 다중 상속 지원 [예제] 다중상속class InputFile{public: void read() {}};class OutputFil

zoosso.tistory.com

반응형