두 가지 방법 :
당신이 푸/A/B/C에
some_method
를 넣을 수없는 경우
class Node
{
public:
Foo* foo;
Node* next;
};
// ...
Node* someNode = GetNode();
// Calls correct method - A::some_method, B::some_method, or C::some_method
someNode->foo->some_method();
것은, 당신은 방문자 디자인 패턴을 조사 할 수 있습니다
1) 더 좋은 방법 :
someMethod가 기본 클래스 Foo의 가상 메소드가되도록 디자인을 바꾸고 파생 클래스에서 재정의하십시오. 로 :
class Foo {
public:
virtual void someMethod() = 0;
};
class A {
public:
void someMethod() { /* implementation specific to A here */ };
};
class B {
public:
void someMethod() { /* implementation specific to B here */ };
};
class C {
public:
void someMethod() { /* implementation specific to C here */ };
};
그런 다음
Foo
에 대한 포인터에있는 것으로 someMethod를 호출 자동으로 적절한 클래스의 메소드를 호출합니다.
someMethod
이
Foo
또는 그 파생물의 일부로 구현 될 수 없기 때문에 수행 할 수없는 경우 (예 : 현재 디자인에있는 클래스의 비공개 멤버에 액세스해야하는 경우),이 기능을 하위 문제로 분리하려고 시도 할 수 있습니다. 이 클래스의 가상 메서드에 넣을 수
A
B
C
.
2) 방법 "나는 선택의 여지가없는"
이
사용 RTTI (런타임 형식 식별이)가 C에 포함되어 ++. 기본 클래스 Foo에 적어도 하나의 가상 메소드가 있어야합니다.#include <typeinfo>
이 필요하고 포인터에 typeid()을 사용하면 type_info 개체가 반환되고 해당 name()
결과는 A
B
및 C
이라는 클래스 이름과 비교할 수 있습니다. 이는 오버 헤드가 더 많고 OOP 디자인 원칙을 위반하기 때문에 아주 좋은 접근법은 아닙니다. 하지만 그게 유일한 옵션이라면 괜찮습니다.
Foo는 거의 소리가 나지 않습니다. some_method에 액세스 할 수 있으면 메서드에 매개 변수로 전달됩니다. Foo 포인터의 연결리스트가 데이터 멤버 – bandai