2009-12-20 4 views
1

멤버 변수 A * my_hash를 가진 클래스 Base가 있다고 가정합니다. 또한 Base 클래스에서 상속받은 Extended 클래스도 있습니다. 또한 확장하는 클래스 B 이 A.C++ 디자인 질문

class Base{ 
    Base(): my_hash(new A) {} 
    //methods which use my_hash 
protected: 
    A* my_hash; 

}; 

class Extended:public Base{ 
//methods which use my_hash from A 
//I cannot have a B* my_other_hash in this class 
//I would like to substitute B* my_hash 
//I cannot let Base create my_hash (of type A*) because that is not what I want. 
}; 
나는 제외하고 (즉, 그것은 상속 모두 사용) 보통을하고 한 가지 중요한 차이점으로, 나는 my_hash가 B로 원하는 확장 좋아할

* 대신 A *.
무언가가 Extended의 메소드 나 Base의 메소드를 통해 my_hash에 액세스 할 때마다 메소드를 B *로 실행하고 싶습니다.

시도해 볼 사항 : Extended에서 다시 정의하는 메소드 호출 (예 : Base())에서 create_hash()를 호출 할 수 없습니다. 해시를 만들 때 Extended 클래스로 돌아갈 수있는 방법이 없어 보이는 것처럼 작동하지 않습니다.

나는 B가 B에 대해 아는 것을 좋아하지 않을 것입니다. 어떻게해야합니까?

+0

B는 A에서 파생 되었습니까? 또는 : A와 B가 관련이 있습니까? –

+0

@Federico : 첫 번째 단락에 "나는 또한 A를 확장하는 클래스 B가 있습니다." –

+0

아래 답변을 통해 클래스 A에 가상 메서드가 있는지 확인하여 클래스 A의 포인터를 통해 메서드를 호출하면 B의 메서드가 실행되도록합니다. – Jagannath

답변

4

, 당신은 그것을 설정할 수 있습니다 (생성자를 통해이 생성자를 숨길 수 있으므로 'Base'에서 상속받지 않는 코드는 확장 할 수 없습니다.)

당신은 당신이 다른 포인터에 그 저장할 수 있습니다하거나 캐스트 'my_hash', '확장'에서 호출 할 수있는 'B'의 새로운 전문 기능을 원하는 경우 또한

class Base{ 
    Base(): my_hash(new A) {} 
    //methods which use my_hash 
protected: 

    A* my_hash; 
    Base(A* hash): my_hash(hash) {} 
}; 

class Extended:public Base{ 
public: 
    Extended() : Base(new B) {} 
}; 

, 'B의 *'을 입력합니다 .

0

자동 채워 넣기에서 제안한 것처럼 템플릿이 여기로 갈 수있는 방법 일 수 있습니다. 그 일을하는 또 다른 방법은 사실 B * my_other_hash (질문에서 언급 한 것처럼)를 사용하고 B의 ctor에서 my_hash를 my_hash로 설정하는 것입니다.

class Extended:public Base{ 
    ExtendedBase(): Base() { 
     my_other_hash = my_hash; 
    } 
} 

그런 다음 확장의 A 또는 B 방법에서 A 방법에 액세스 할 수 있습니다. 그 중 하나만 삭제하십시오! Base의 dtor 또는 계층 구조 외부에서 다른 곳에서 메모리를 관리하는 경우.