2011-12-07 2 views
2

두 추상 클래스 사이에 컴포지션 관계 (집계가 아닌)를 만들 수 있습니까?추상 클래스 간의 컴포지션

추상 클래스를 인스턴스화 할 수 없기 때문에 나는 그렇게 생각하지 않습니다. 그러나 아마도 그것을 할 수있는 간단한 방법이 있습니다.

답변

4

예 : 당신은 추상적 인 유형에 대한 포인터를 가질 수 있습니다

class A 
{ 
    virtual ~A() = 0; 
}; 


class B 
{ 
    virtual ~B() = 0; 
    A* mA; 
}; 

.

+0

A와 B 사이의 집계가 아닌가요? mA가 B 외부에 살고 있지 않습니까? mA의 수명에 대한 책임을 만들기 위해서는 B를 고려해야합니다. B :: ~ B {delete mA;} ... 맞습니까? (가상 ~ B() 및 가상 ~ B() = 0이 아님) – Ale

+0

필요하지 않습니다. 책임은 논리적 인 것이다. B. 내부에서 mA를 만들지 않아도됩니다. 외부에서 할당하여 클래스 외부의 무언가에 책임을 위임 할 수 있습니다. –

0

다른 클래스에 대한 포인터 또는 참조를 사용할 수 있습니다. 예를 들어 :

class A { 
public: 
    virtual void m() = 0; 
    virtual ~A() { } 
}; 

class B { 
public: 
    virtual void m() = 0; 
    virtual ~A() { } 

private: 
    boost::scoped_ptr<A> a; 
}; 

C++ 11에서 대신 std::unique_ptr를 사용할 수 있습니다. 이렇게하면 B을 복사 할 수 없게 만듭니다. 이는 하위 유형 다형성을 사용하는 클래스에서 다소 일반적입니다.

+0

a를 비공개 멤버로 선언했습니다. B는 추상이기 때문에 그것을 보호 된 것으로 선언하는 것이 아닌가? – Ale