뿌리는 같지만 다른 가지의 클래스를 상속받는 법?
안녕하세요, 간단한 3D 그래픽 엔진을 제작하고 있는 고등학생입니다.
설계와 구현, 복합적으로 문제가 생겨 이렇게 도움을 청하게 되었습니다.
인터페이스 클래스를 정의해두고(멤버 변수가 전혀 없고 전부 순수 가상함수입니다)
구현 클래스(concrete class)를 추상 팩토리에서 생성해서 반환하는 형식입니다. 물론 구현 클래스는 클라이언트로부터 숨겨져 있고요.
예) pNode = NodeManager->CreateNewNode();
그러나 다른 대부분의 그래픽 엔진이 그러하듯이, 이 노드 인터페이스 클래스를 상속받아서 확장해가는데,
여기까지는 괜찮습니다.
헌데, 구현 클래스에서 내부적으로 리스트를 사용하여 자식 노드를 관리합니다.
그리고 렌더러도 인터페이스 클래스 포인터가 아닌, 구현 클래스 포인터로서 그 리스트에 직접 접근하여서 순회하고요.
따라서 addChildNode(INode* pNode)와 같은 메서드들은 사용자가 상속할 때 오버라이딩을 하면 안되겠지만,
문제는 그 상속받은 클래스의 인스턴스를 어떻게 생성하느냐입니다.
class MyClass : public INode{//...};
요런 식일 때
pNode = new MyClass(...);
이런 식으로 생성할 수가 없답니다..
이렇게 되겠네요.
INode
|
|-----------------
| |
BaseNode MyNode
요약하자면, MyNode가 BaseNode를 상속하는 것처럼 구현이 가능하냐는 겁니다.
가상생성자 같은 개념이 있다면 되겠지만,
그게 언어적으로 지원이 안되는 개념이다보니...
댓글 달기