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 |